如果循序任務不足以使用,則更進一步的是動態任務。與預期您傳回純值 A
的 Def.task
不同,使用 Def.taskDyn
時,您會傳回一個任務 sbt.Def.Initialize[sbt.Task[A]]
,任務引擎可以利用這個任務繼續其餘的計算。
讓我們嘗試實作一個稱為 compilecheck
的自訂任務,該任務會執行 Compile / compile
,然後執行 scalastyle-sbt-plugin 新增的 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
,並讓它執行我們想要它執行的操作。