SBT 中的 Def.task 和 .taskValue 是什么?

Ale*_*dar 3 sbt

我读SBT文档相当彻底,现在并没有一个简短提及Def.tasktaskValue但至今没有任何解释。他们在这里说:

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 但实际上没有任何成功。那部分代码没有很好地记录。

lau*_*lic 7

我认为文档介绍部分中的这个特定示例不必要地复杂。在这个例子中,你必须使用.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 文档中关于任务的一些其他相关部分: