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

时间:2017-12-04 22:09:50

标签: sbt

我现在正在彻底阅读SBT文档,并简要提及Def.tasktaskValue,但到目前为止还没有解释。 他们说here跟随:

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 ++=. 

并提供以下代码段:

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

这给我带来的问题多于答案。这与某些SBT任务对另一项任务的常规依赖有什么不同?我什么时候应该使用这个宏?等

我也试过检查scaladoc,但确实没有任何成功。这部分代码没有很好地记录下来。

1 个答案:

答案 0 :(得分:3)

我认为文档介绍部分中的这个特定示例不必要地复杂化。在此示例中,您必须使用.taskValue,因为sourceGenerators值类型为Seq[Task[Seq[File]]],因此您必须向其添加任务,而不是该值任务。

“基于其他键值的任务”的简单示例是

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

:= / += / ++= / ~=运算符的右侧,您可以使用带有简单.value后缀的其他任务值。写

foo := bar.value + 1

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

在这个简单的示例中,它只是不必要,但是当您想要将任务实现与任务键设置分开时,Def.task会变得有用:

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

因此Def.task允许您编写任务定义并使用其他任务/设置(使用.value)。然后,您可以在其他位置(在项目设置中)设置相应的任务键时评估此任务定义:

foo := fooTask(5).value

但是,如果您需要在不对其进行评估的情况下引用任务定义本身,则可以使用.taskValue代替.value,就像您的示例中一样。有关sourceGenerators的详细信息,请参阅generating sources上的文档。

以下是有关任务的sbt文档的其他相关部分: