web-dev-qa-db-ja.com

標準タスクの前後にカスタムタスクを自動的に実行する

標準タスクの1つを実行する前に、カスタマイズを行いたいことがよくあります。既存のタスクを希望の順序で実行する新しいタスクを作成できることはわかっていますが、面倒であり、開発者がコンパイルではなくmy-compileを実行することになっていることを見逃す可能性が高く、エラーの修正が困難になります。

したがって、カスタムタスク(たとえばprepare-app)を定義し、それを既存のタスクの依存関係ツリー(たとえばpackage-bin)に挿入して、毎回誰かが呼び出しpackage-binカスタムタスクはその直前に実行されます。

私はこれをやってみました

  def mySettings = {
    inConfig(Compile)(Seq(prepareAppTask <<= packageBin in Compile map { (pkg: File) =>
      // fiddle with the /target folder before package-bin makes it into a jar
    })) ++
    Seq(name := "my project", version := "1.0")
  }

  lazy val prepareAppTask = TaskKey[Unit]("prepare-app")

ただし、コンパイル出力をjarにパッケージ化する直前にpackage-binによって自動的に実行されることはありません。では、上記のコードを適切なタイミングで実行するように変更するにはどうすればよいですか?

より一般的には、コンパイルなどの他のタスクへのフックに関する情報はどこにありますか?また、標準タスクが呼び出される前後に独自のタスクが実行されるようにする一般的な方法はありますか?.

33
Lars Tackmann

既存のタスクの拡張については、 タスク のSBTドキュメントが文書化されています(セクション 既存のタスクの変更 を参照してください)。

このようなもの:

compile in Compile <<= (compile in Compile) map { _ => 
  // what you want to happen after compile goes here 
}

実際には、別の方法があります-コンパイルに依存するようにタスクを定義します

prepareAppTask := (whatever you want to do) dependsOn compile

次に、それに依存するようにpackageBinを変更します。

packageBin <<= packageBin dependsOn prepareAppTask

(上記のすべてはテストされていませんが、一般的な推力は機能するはずです、私は願っています)。

33
Paul Butcher

@Paul Butcherによる以前の回答の更新として、<<==がサポートされなくなったため、SBT1.xバージョンではこれを少し異なる方法で行うことができます。プロジェクトの1つで使用するコンパイルの前に実行するサンプルタスクの例を取り上げました。

lazy val wsdlImport = TaskKey[Unit]("wsdlImport", "Generates Java classes from WSDL")

wsdlImport := {
  import sys.process._
  "./wsdl/bin/wsdl_import.sh" !
  // or do whatever stuff you need
}

(compile in Compile) := ((compile in Compile) dependsOn wsdlImport).value

これは、1.xより前に行われていた方法と非常によく似ています。

また、 公式SBTドキュメント によって提案される別の方法があります。これは基本的に(依存関係の階層ではなく)タスクの構成です。上記と同じ例をとると:

(compile in Compile) := {
  val w = wsdlImport.value
  val c = (compile in Compile).value
  // you can add more tasks to composition or perform some actions with them
  c
}

最初の例は少しすっきりしているように見えますが、場合によっては柔軟性を高めているように感じます。

SBT 1.2.3でテストされていますが、他の1.xでも動作するはずです。

1
Vladimir Salin