2011-11-27 41 views
61

我正在使用簡單構建工具構建一些僅限Java的項目。當我使用sbt publish-local發佈項目中的工件時,生成的工件將Scala版本附加到它們的名稱上。對於Scala項目來說,這是有道理的,但是因爲這些只是Java項目,所以沒有。我將如何禁用Scala版本的這個後綴?或者我可以嗎?如何從構建+使用簡單構建工具發佈的工件中刪除_ <scala-version>後綴?

僅供參考我正在使用sbt 0.11.1,Scala 2.9.1和.sbt文件進行構建配置(儘管轉移到完整的項目配置將不成問題)。

回答

8

這是記錄在xsbt維基下Modifying default artifacts。從這個頁面:

例如,產生最少的名不經分類或交叉路徑:

artifactName := { (sv: ScalaVersion, module: ModuleID, artifact: Artifact) => 
    artifact.name + "-" + module.revision + "." + artifact.extension 
} 
+0

感謝保羅。不幸的是,這對發佈的工件名稱沒有任何可觀察的影響。已發佈的工件在名稱末尾仍具有Scala版本。我把垃圾添加到了結果字符串中,但是也沒有顯示出來。這裏是我的build.scala:http://pastie.org/2931253 – James

+1

此外,您引用的那個頁面說,artifactName設置不會影響發佈的名稱。 「該函數可能會被修改爲爲工件生成不同的本地名稱,而不會影響發佈的名稱,這是由工件定義與存儲庫模式結合確定的。」 我曾嘗試修改工件設置並提供一個新的工件,但這並不能讓我直接擺脫scala版本的後綴。它看起來像sbt將把scalaVersion傳遞給Artifact的artifactName方法。重寫該方法是我唯一的選擇嗎? – James

+0

啊該死的 - 對不起,這不是我以前試過的東西,那個頁面看起來就像你乍一看所需要的。無論如何,看起來你已經找到了它 - 抱歉曲線球。 –

2

雖然接受的答案是完全正確,你應該永遠設置crossVersionsfalse公開發布斯卡拉文物。嵌入式scala版本是一個重要的兼容性功能,因爲不同版本的Scala庫可能不是二進制兼容的。

只針對項目設置crossVersionsfalse,這些項目與嚴格限於Java的問題中的項目類似。

+0

是否可以發佈兩個工件?一個與Scala版本和一個沒有? –

+0

我想你可以,但我不確定我明白你爲什麼會這樣做?如果你真的爲多個編譯器版本交叉編譯你的scala,你會怎麼做? – gregsymons

5

我知道這個問題很老,但我一直在問自己同樣的問題,現在實際上有一個非常簡單的方法。所有你所要做的是聲明使用%代替%%的依賴性:

%:用於從你 供給的字符串來構造常春藤模塊ID的方法。

%%:在groupID之後使用時,會自動將 項目的Scala版本(如_2.10)添加到名稱 名稱的末尾。

http://alvinalexander.com/scala/sbt-how-to-manage-project-dependencies-in-scala

+1

該解決方案比接受的更好,因爲您只需更改Scala版本號存在問題的依賴項。通過將'crosspaths'設置爲false,您必須更改所有依賴關係並手動添加Scala版本。 – Victor