1. 使用 Def.taskDyn 定义动态任务

使用 Def.taskDyn 定义动态任务 

如果 顺序任务 不够用,下一步就是 动态任务。与期望返回纯值 ADef.task 不同,使用 Def.taskDyn,你返回一个任务 sbt.Def.Initialize[sbt.Task[A]],任务引擎可以使用它继续其余的计算。

让我们尝试实现一个名为 compilecheck 的自定义任务,它运行 scalastyle-sbt-plugin 添加的 Compile / compileCompile / scalastyle 任务。

project/build.properties 

sbt.version=1.9.8

project/style.sbt 

addSbtPlugin("org.scalastyle" %% "scalastyle-sbt-plugin" % "1.0.0")

build.sbt v1 

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

build.sbt v2 

如果我们可以返回与 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,并使其按照我们想要的方式执行。