2017-12-04 1 views
0

Ich lese jetzt SBT Dokumente ziemlich gründlich und es gibt eine kurze Erwähnung von Def.task und taskValue, aber es gibt keine Erklärung bis jetzt. Sie sagen here folgende:Was ist Def.task und .taskValue in SBT?

You can compute values of some tasks or settings to define or append a value for another task. 
It’s done by using Def.task and taskValue as an argument to :=, +=, or ++=. 

Und bieten Schnipsel folgenden Code:

sourceGenerators in Compile += Def.task { 
    myGenerator(baseDirectory.value, (managedClasspath in Compile).value) 
}.taskValue 

Diese mehr Fragen als Antworten für mich bringt. Wie unterscheidet sich das von der normalen Abhängigkeit einer SBT-Aufgabe von einer anderen Aufgabe? Wann sollte ich dieses Makro verwenden? usw.

Ich habe auch versucht, scaladoc aber ohne Erfolg wirklich zu überprüfen. Dieser Teil des Codes ist nicht gut dokumentiert.

Antwort

1

Ich denke, dass dieses spezielle Beispiel im einleitenden Teil der Dokumentation unnötig kompliziert ist. In diesem Beispiel müssen Sie .taskValue verwenden, nur weil sourceGenerators Werttyp Seq[Task[Seq[File]]] ist, so müssen Sie eine Aufgabe hinzufügen, nicht der Wert dieser Aufgabe.

Ein einfacheres Beispiel für diese „Aufgaben basierend auf anderen Tasten Werte“ ist

homepage := Some(
    url(s"https://github.com/${organization.value}/${name.value}") 
) 

Im rechten Teil von :=/+=/++=/~= Operatoren Sie andere Aufgaben Werte mit einfachen .value Suffix verwenden können. Schreiben

foo := bar.value + 1 

ist die gleiche wie

foo := Def.task { bar.value + 1 }.value 

In diesem einfachen Beispiel ist es nur unnötig, sondern Def.task wird nützlich, wenn Sie Aufgabe, die Umsetzung der Aufgabe Schlüssel Einstellung trennen wollen:

def fooTask(n: Int): Def.Initialize[Task[Int]] = Def.task { 
    bar.value + n 
} 

So Def.task können Sie eine Aufgabendefinition schreiben und andere Aufgaben/Einstellungen verwenden (mit .value). Dann können Sie diese Aufgabe Definition bewerten, wenn Sie die entsprechende Aufgabe Schlüssel irgendwo anders festgelegt (in den Projekteinstellungen):

foo := fooTask(5).value 

Aber wenn Sie auf die Aufgabendefinition verweisen müssen sich, ohne es zu bewerten, können Sie .taskValue stattdessen verwenden von .value, wie in Ihrem Beispiel. Weitere Informationen zu sourceGenerators finden Sie in der Dokumentation unter generating sources.

Hier sind einige andere relevante Teile der sbt Dokumentation über Aufgaben:

+1

vielen Dank für den Fahrplan :) Nahm etwas Zeit, um das zu lesen, aber jetzt verstehe ich besser. –

Verwandte Themen