もしシーケンシャルタスクでは不十分な場合、次のステップとして動的タスクがあります。純粋な値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を呼び出して、目的の動作を実行できます。