我读SBT文档相当彻底,现在并没有一个简短提及Def.task和taskValue但至今没有任何解释。他们在这里说:
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 ++=.
Run Code Online (Sandbox Code Playgroud)
并提供以下代码片段:
sourceGenerators in Compile += Def.task {
myGenerator(baseDirectory.value, (managedClasspath in Compile).value)
}.taskValue
Run Code Online (Sandbox Code Playgroud)
这给我带来的问题多于答案。这与某些 SBT 任务对另一个任务的常规依赖有何不同?我应该什么时候使用这个宏?等等。
我也试过检查 scaladoc 但实际上没有任何成功。那部分代码没有很好地记录。
我认为文档介绍部分中的这个特定示例不必要地复杂。在这个例子中,你必须使用.taskValue,因为sourceGenerators值类型是Seq[Task[Seq[File]]],所以你必须向它添加一个任务,而不是那个任务的值。
“基于其他键值的任务”的一个更简单的例子是
homepage := Some(
url(s"https://github.com/${organization.value}/${name.value}")
)
Run Code Online (Sandbox Code Playgroud)
在右部:=/ +=/ ++=/~=运营商可以使用其他任务值与简单的.value后缀。写作
foo := bar.value + 1
Run Code Online (Sandbox Code Playgroud)
是相同的
foo := Def.task { bar.value + 1 }.value
Run Code Online (Sandbox Code Playgroud)
在这个简单的示例中,它只是不必要的,但是Def.task当您想将任务实现与任务键设置分开时会变得很有用:
def fooTask(n: Int): Def.Initialize[Task[Int]] = Def.task {
bar.value + n
}
Run Code Online (Sandbox Code Playgroud)
SoDef.task允许您编写任务定义并在其中使用其他任务/设置(使用.value)。然后,当您在其他地方(在您的项目设置中)设置相应的任务键时,您可以评估此任务定义:
foo := fooTask(5).value
Run Code Online (Sandbox Code Playgroud)
但是,如果您需要在不评估的情况下引用任务定义本身,则可以使用.taskValue代替.value,就像在您的示例中一样。有关生成源的更多信息,请参阅文档sourceGenerators。
以下是 sbt 文档中关于任务的一些其他相关部分: