16

次のコマンドを使用して、コンパイル前にタスクを自動的に実行できます。

compile in Compile <<= (compile in Compile).dependsOn(myTask)

どうすれば同じことをコンパイル後に行うことができますか?

私はできることを知っています:

compile in Compile <<= (compile in Compile) map{x=>
  // post-compile work
  doFoo()
  x
}

任意の Scala コードを実行するには、コンパイル イベントが発生したときにターゲット タスク自体を自動的に実行する必要があります。

次のようなことをします:

val foo = TaskKey[Unit]("foo", "...")
val fooTask = foo <<= scalaInstance map {si =>
...
} dependsOn(compile in Compile)

sbt> プロンプトから「foo」と入力すると動作します。つまり、タスクはコンパイル後に実行されますが、目標はコンパイル タスク自体にフックすることなので、コンパイルが発生するたびに、コンパイルの完了後に foo タスクが自動的に呼び出されます。

これは可能ですか、それとも組み込みのコンパイル タスクにフックするのが間違っているのでしょうか?

4

1 に答える 1

13

一般に、タスクに依存するいくつかのタスクがあります。

compileが「Grunt 用にコンパイルしてセットアップする」という意味で使用されている場合は、それprepareGruntに依存するタスクを作成し、代わりにcompileそれmyTaskを実行します。

myTaskプロジェクトのクラスとリソースが他の何かによって使用される前に実行する必要がある場合は、それを の依存関係にしexportedProductsます。run依存プロジェクトのやなどtestのタスクは、そのタスクからエクスポートされたクラスパス エントリを取得します。

「コンパイル後に実行」の危険性はmyTask、実際に必要なタスクの前に実行されないことです。triggeredByメソッド onがありますが、Initialize[Task[T]]悪用されやすいため、すべてのタスクが実行された後にのみタスクの出力が使用されることがわかっている場合にのみ使用する必要があります。

于 2013-06-21T20:35:32.973 に答える