如果 顺序任务 不够用,下一步就是 动态任务。与期望返回纯值 A
的 Def.task
不同,使用 Def.taskDyn
,你返回一个任务 sbt.Def.Initialize[sbt.Task[A]]
,任务引擎可以使用它继续其余的计算。
让我们尝试实现一个名为 compilecheck
的自定义任务,它运行 scalastyle-sbt-plugin 添加的 Compile / compile
和 Compile / scalastyle
任务。
sbt.version=1.9.8
addSbtPlugin("org.scalastyle" %% "scalastyle-sbt-plugin" % "1.0.0")
lazy val compilecheck = taskKey[sbt.inc.Analysis]("compile and then scalastyle")
lazy val root = (project in file("."))
.settings(
compilecheck := (Def.taskDyn {
val c = (Compile / compile).value
Def.task {
val x = (Compile / scalastyle).toTask("").value
c
}
}).value
)
现在我们有了与顺序任务相同的东西,除了我们现在可以从第一个任务返回结果 c
。
如果我们可以返回与 Compile / compile
相同的返回类型,实际上可能会将键重新连接到我们的动态任务。
lazy val root = (project in file("."))
.settings(
Compile / compile := (Def.taskDyn {
val c = (Compile / compile).value
Def.task {
val x = (Compile / scalastyle).toTask("").value
c
}
}).value
)
现在我们可以从 shell 中实际调用 Compile / compile
,并使其按照我们想要的方式执行。