もしシーケンシャルタスクでは不十分な場合、次のステップとして動的タスクがあります。純粋な値A
を返すことを期待するDef.task
とは異なり、Def.taskDyn
ではタスクsbt.Def.Initialize[sbt.Task[A]]
を返し、タスクエンジンは残りの計算を続行できます。
Compile / compile
タスクと、scalastyle-sbt-pluginによって追加されたCompile / scalastyle
タスクを実行するcompilecheck
というカスタムタスクを実装してみましょう。
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
)
これで、シェルからCompile / compile
を呼び出して、目的の動作を実行できます。