我现在已经彻底阅读了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 ++=.
并提供以下代码段:
sourceGenerators in Compile += Def.task {
myGenerator(baseDirectory.value, (managedClasspath in Compile).value)
}.taskValue
这给我带来的问题多于答案。这与某些SBT任务对另一个任务的常规依赖性有何不同?我什么时候应该使用这个宏?等。
我还试图检查Scaladoc,但实际上没有任何成功。代码的那一部分没有很好地记录。
我认为文档介绍性部分中的这个特殊示例是不必要的复杂。在此示例中,您必须使用.taskValue
仅仅是因为sourceGenerators
值类型为Seq[Task[Seq[File]]]
,因此您必须向其添加 task ,而不是该任务的值。
这个"基于其他密钥值的任务"的更简单示例是
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
的更多信息,请参见有关生成资源的文档。
这是有关任务的SBT文档的其他一些相关部分:
- 任务
- 任务/设置:动机
- 任务的执行语义
- 测序任务