2011-09-13 27 views
5

我想定義一個任務,調用compile和packageBin任務,然後完成它的任務。我怎麼做?目前這隻能做第二部分,並跳過編譯& 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

至於解決方法,我可以使用〜; compile; package; dist任務 – arturaz

回答

3

<<=是TaskKey上的一個返回值的方法。它不會在任何地方更新可變狀態,所以在示例代碼中,第一個調用的結果將被丟棄。爲了解決這個問題,將packageBin聲明爲輸入,但忽略結果值。請注意,packageBin依賴於編譯,因此取決於編譯是不必要的。

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

這是不可能的,你想在一個UpdateReport的所有文件複製到單獨的文件的名稱基於目錄。不同的依賴關係可能具有相同的文件名。此外,這將包括來自所有配置的依賴性,包括測試依賴性。

對於第一個問題,請使用關聯的ModuleID在目標目錄中構建路徑,就像在retrieveManaged := true時在lib_managed目錄中完成一樣。對於第二個問題,請僅選擇所需配置的文件。

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

看到其他有用的方法sbt.UpdateReportsbt.RichUpdateReport API文檔。

如果您不關心文件名衝突,則可以從dependencyClasspath獲取依賴項文件。例如:

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

,並從cp.filesSeq[File]

+0

感謝您的很好回答。但是,當我嘗試添加packagebin作爲依賴項時,我得到: [錯誤] sbt.Init $未初始化:引用未初始化的設置{file:/ home/arturas/work/spacegame/server/vendor/SpaceMule /} SpaceMule/*:來自{file:/ home/arturas/work/spacegame/server/vendor/SpaceMule /}的封裝SpaceMule/*:dist [錯誤]對完整日誌使用'last'。 – arturaz

+0

您是否包含'in Compile'部分? –

+1

哦,我一定錯過了它。它現在的作品,謝謝:) – arturaz

相關問題