2012-06-30 49 views
121

哪個構建工具最適合Scala?他們每個人的優點和缺點是什麼?如何確定在項目中使用哪一個?在Scala項目中使用sbt vs maven的優缺點

+4

由於其對多模塊構建的卓越支持,我從Maven轉換到了Gradle for Scala項目。使用SBT的Twitter [經驗](http://www.youtube.com/watch?v=6pfdm-gIZus)被他們描述爲「致盲的痛苦」,他們試圖擺脫它(用Maven作爲停止 - 在這個過程中的差距)。 –

+15

另一個很酷的封閉問題... –

+8

我看到的很多很好的問題都只是關閉了;我不知道是誰賦予這些人權力來專斷地決定是否解決問題。我甚至沒有注意他們是否已經接近或不再。 – user1888243

回答

74

我們使用Maven在工作中構建Scala項目,因爲它與我們的CI服務器很好地集成在一起。當然,我們可以運行一個shell腳本來啓動一個構建,但是我們還有很多來自Maven的其他信息,我們希望進入CI。這就是我可以考慮將Maven用於Scala項目的唯一原因。

否則,只需使用SBT。你可以訪問相同的依賴關係(真的是關於maven的最好的部分,恕我直言)。你也可以得到增量編譯,這是巨大的。能夠在你的項目中啓動一個shell,這也很棒。

ScalaMock只適用於SBT,你可能會想要使用它而不是Java模擬庫。最重要的是,它的很多更容易擴展SBT,因爲你可以在構建文件中編寫完整的scala代碼,所以你不必經歷編寫Mojo的所有細節。

總之,只要使用SBT,除非您確實需要緊密集成到您的CI服務器。

+19

我不同意上面的任何一個,但只是想指出我正在寫[ScalaMock 3](http:// www。 paulbutcher.com/2012/06/scalamock-3-0-preview-release/),其中一個主要目標是使其他構建系統更容易支持。 –

+0

太好了,因爲我不確定我將能夠很快在工作中使用SBT。期待它! – mblinn

+1

爲了完整起見,值得一提的是,只要您不需要使用生成的模擬(即只要您只需要模擬,ScalaMock 2就可以在任何*構建系統(它只是一個jar)性狀/接口)。 –

19

這個問題有可能產生很多意見;最好有清晰的要求清單或描述你的環境,以前的知識等。

FWIW,在this scala mailing list thread有更多的意見。

我2C是:與SBT去,如果你沒有特殊要求

  • 簡單的項目,這是完全不費力(你甚至不需要構建文件,直到你有依賴)
  • 它通常在Scala開源項目中使用。您可以通過查看其他人的項目輕鬆瞭解配置。此外,許多項目假設您使用sbt併爲您提供ready-made copy+paste instruction以將它們作爲依賴項添加到您的項目中。
  • 如果您使用IntelliJ IDEA,它可以完全集成。你可以通過have IDEA use sbt來連續編譯你的項目,反之亦然,你可以使用sbt來快速地generate IDEA projects。如果你處於'快照'週期,取決於你自己的其他庫從次要版本跳轉到次要版本,最後一個特別有用 - 只需關閉項目,更新構建文件中的版本,重新運行gen-idea任務,並重新打開項目:完成更新。
  • 自帶願與你最需要的任務(compiletestrundocpublish-localconsole) - 的console是最好的功能之一。
  • 有些人強調了依賴可以直接從GitHub獲取的源代碼庫的功能。我沒有用過這個,所以不能在這裏評論。

有些人討厭SBT,因爲它使用的Ivy依賴管理(我不能對其利弊進行評論,但大部分時間,它是一個非問題),有些人討厭SBT,因爲您指定的根據Scala DSL而不是XML構建文件。有些人對sbt的格式從v0.7更改爲v0.10感到失望,但顯然,如果您從頭開始,遷移不會影響您。

+26

我恨SBT,因爲它濫用象徵運營商和一些愚蠢的決定,比如都支持名.bst和.scala清晰度格式的,但把它們放在不同的位置,並在名.bst報表必須由至少空行等分開sbt的文件正在改進,但目前還不夠好。我最想念的是一些完整的(最小到現實世界的複雜).sbt/.scala示例文件,逐行解釋,涵蓋所有sbt功能。也就是說,我每天都會使用sbt,因爲Maven會吸收更多。 – xiefei

+6

太糟糕了,這個問題被關閉,我相信有實際的差異,以及:例如本文節選自曼寧本書SBT:「如果有Maven目標(比如一個目標產生被消耗的文件之間 依賴另一種),那麼你不能 與Maven並行化編譯。 隨着SBT,你必須指定任務之間的顯式依賴,這使得SBT並行運行 任務默認情況下,如果任務A依賴於B和C也取決於B,然後運行任務B,然後在 的並行運行A和C.「希望這個評論有助於一些讀者。 – jhegedus

+16

我發現這個線程非常有用。我經常認爲Stackoverflow版主過於熱切地關閉了主題。誰在乎他們是否「脫離主題」,當他們經常是用戶正在尋找的東西(並通過網絡搜索找到)時。就好像Stackoverflow的mod正試圖故意重新創建[xkcd 979](https://xkcd.com/979/)。 – Ville

相關問題