1. 使用 Def.taskDyn 定義動態任務

使用 Def.taskDyn 定義動態任務 

如果循序任務不足以使用,則更進一步的是動態任務。與預期您傳回純值 ADef.task 不同,使用 Def.taskDyn 時,您會傳回一個任務 sbt.Def.Initialize[sbt.Task[A]],任務引擎可以利用這個任務繼續其餘的計算。

讓我們嘗試實作一個稱為 compilecheck 的自訂任務,該任務會執行 Compile / compile,然後執行 scalastyle-sbt-plugin 新增的 Compile / 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,並讓它執行我們想要它執行的操作。