2011-09-13 19 views
5

タスクを定義して、コンパイルタスクとpackageBinタスクを呼び出し、そのタスクを実行したいとします。それ、どうやったら出来るの?現在のところ、これは2番目の部分だけを実行し、& packageBinタスクをスキップします。SBT 0.10で他のタスクに依存してコードを実行する方法は?

lazy val dist = TaskKey[Unit](
    "dist", "Creates a project distribution in dist/ folder." 
) 
def distTask = { 
    dist <<= dist.dependsOn(compile, packageBin) 
    dist <<= (update, crossTarget).map { case (updateReport, out) => 
    updateReport.allFiles.foreach { srcPath => 
     val destPath = out/"lib"/srcPath.getName 
     IO.copyFile(srcPath, destPath, preserveLastModified=true) 
    } 
    } 
} 
+0

これまでの回避策として、〜;コンパイル;パッケージ; distタスクを使用することができました – arturaz

答えて

3

<<=は、値を返すTaskKeyのメソッドです。どこでも変更可能な状態は更新されないので、サンプルコードでは、最初の呼び出しの結果は破棄されています。これを修正するには、packageBinも入力として宣言しますが、結果の値は無視してください。 packageBinはコンパイルに依存するので、コンパイルに依存しないことに注意してください。

dist <<= (update, crossTarget, packageBin in Compile) map { (updateReport, out, _) => 

あなたがファイル名のみに基づいたディレクトリにUpdateReport内のすべてのファイルをコピーすることはほとんどありません。異なる依存関係が同じファイル名を持つことは可能です。また、これにはテストの依存関係を含むすべての構成からの依存関係も含まれます。

retrieveManaged := trueの場合、lib_managedディレクトリで行われるように、最初の問題については、関連するModuleIDを使用してターゲットディレクトリ内のパスを構築してください。 2番目の問題については、必要な構成のファイルのみを選択してください。

updateReport.matching(configurationFilter(Runtime.name)).foreach... 

他の有用な方法についてsbt.UpdateReportsbt.RichUpdateReport APIのドキュメントを参照してください。

ファイル名の衝突が心配されていない場合は、dependencyClasspathから依存ファイルを取得できます。たとえば:

dist <<= (crossTarget, packageBin in Compile, dependencyClasspath in Runtime) map { (out, _, cp) => 

cp.filesからSeq[File]を取得します。

+0

素晴らしい答えをありがとう。しかし、packageBinを依存関係として追加しようとすると、次のようになります。 [エラー] sbt.Init $未初期化:初期化されていない設定{file:/ home/arturas/work/spacegame/server/vendor/SpaceMule /}への参照SpaceMule/*:package from {file:/ home/arturas/work/spacegame/server/vendor/SpaceMule /} SpaceMule/*:dist [エラー]完全なログには 'last'を使用してください。 – arturaz

+0

'コンパイル中'の部分を含めましたか? –

+1

ああ、私はそれを逃したに違いない。それは今、おかげで動作します:) – arturaz

関連する問題