我现在正在彻底阅读SBT文档,并简要提及Def.task
和taskValue
,但到目前为止还没有解释。
他们说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,但确实没有任何成功。这部分代码没有很好地记录下来。
答案 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文档的其他相关部分: