1. Def.taskDynによる動的タスクの定義

Def.taskDynによる動的タスクの定義 

もしシーケンシャルタスクでは不十分な場合、次のステップとして動的タスクがあります。純粋な値Aを返すことを期待するDef.taskとは異なり、Def.taskDynではタスクsbt.Def.Initialize[sbt.Task[A]]を返し、タスクエンジンは残りの計算を続行できます。

Compile / compileタスクと、scalastyle-sbt-pluginによって追加されたCompile / scalastyleタスクを実行するcompilecheckというカスタムタスクを実装してみましょう。

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
  )

これで、シェルからCompile / compileを呼び出して、目的の動作を実行できます。