逐次タスクだけで十分じゃなければ、次のステップは動的タスクだ。純粋な型 A
の値を返すことを期待する Def.task
と違って、Def.taskDyn
は sbt.Def.Initialize[sbt.Task[A]]
という型のタスク・エンジンが残りの計算を継続するタスクを返す。
compile in Compile
を実行した後で scalastyle-sbt-plugin の scalastyle in Compile
タスクを実行するカスタムタスク、compilecheck
を実装してみよう。
sbt.version=0.13.11
addSbtPlugin("org.scalastyle" %% "scalastyle-sbt-plugin" % "0.8.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 in Compile).value
Def.task {
val x = (scalastyle in Compile).toTask("").value
c
}
}).value
)
これで逐次タスクと同じものができたけども、違いは最初のタスクの結果である c
を返していることだ。
compile in Compile
の戻り値と同じ型を返せるようになったので、もとのキーをこの動的タスクで再配線 (rewire) できるかもしれない。
lazy val root = (project in file(".")).
settings(
compile in Compile := (Def.taskDyn {
val c = (compile in Compile).value
Def.task {
val x = (scalastyle in Compile).toTask("").value
c
}
}).value
)
これで、compild in Compile
をシェルから呼び出してやりたかったことをやらせれるようになった。