What is Def.task and .taskValue in 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 ++=. 

并提供以下代码段:

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文档的其他一些相关部分:

  • 任务
  • 任务/设置:动机
  • 任务的执行语义
  • 测序任务

最新更新