在Scala项目中使用sbt vs maven的利弊[关闭]


138

哪种构建工具最适合Scala?它们各自的优缺点是什么?如何确定在项目中使用哪一个?


5
由于对多模块构建的出色支持,我从Maven转到了Scala项目的Gradle。Twitter 将SBT的经历描述为“盲目的痛苦”,他们正在努力摆脱它(Maven在此过程中是一个权宜之计)。
Ben Manes

24
另一个很酷的封闭式问题……
Cedric H.

14
我看到如此多的好问题刚刚结束。我不知道是谁赋予这些人权力以决定是否关闭问题。我什至不注意它们是否接近。
user1888243

2
同意。幸运的是,在此问题关闭之前,我们有2个答案。可怜那些谁票关闭这个问题...
HQT

Answers:


83

我们正在使用Maven在工作中构建Scala项目,因为它与我们的CI服务器很好地集成在一起。当然,我们可以运行一个shell脚本来启动构建,但是我们从Maven中获得了很多其他信息,我们希望将它们纳入CI中。这是我想到可以将Maven用于Scala项目的唯一原因。

否则,只需使用SBT。您可以访问相同的依赖项(真正是有关Maven的最佳部分,恕我直言)。您还将获得增量编译,这是巨大的。在项目内部启动Shell的能力也很棒。

ScalaMock仅适用于SBT,您可能要使用它而不是Java模拟库。最重要的是,扩展SBT 更加容易,因为您可以在构建文件中编写完整的Scala代码,因此您不必经历编写Mojo的所有繁琐工作。

简而言之,除非确实需要紧密集成到CI服务器中,否则请使用SBT。


21
我不同意以上任何内容,但只是想指出我正在编写ScalaMock 3,其主要目标之一是使支持其他构建系统更加容易。
Paul Butcher

1
仅出于完整性考虑,值得一提的是,ScalaMock 2可以在任何构建系统上正常工作(它只是一个jar),只要您不需要使用生成的模拟即可(例如,只要您只需要模拟特征/接口即可) )。
保罗·布彻


3
他们为什么不为Maven写增量编译呢?恕我直言,sbt是未治疗的NIH综合征的典型例子...
Cpt。Senkfuss 2014年

1
为什么由于SBT而导致CI出现问题?
丹尼尔(Daniel)

21

这个问题有可能引起很多意见。最好有明确的需求列表或环境描述,以前的知识等。

FWIW,在此scala邮件列表线程中还有更多意见。

我的2c是:如果没有特殊要求,请选择sbt

  • 对于简单的项目,这完全不费吹灰之力(在有了依赖项之前,您甚至不需要构建文件)
  • 它在Scala开源项目中普遍使用。通过浏览其他人的项目,您可以轻松了解配置。另外,许多项目都假定您使用sbt并为您提供现成的复制+粘贴说明,以将其添加为项目的依赖项。
  • 如果使用IntelliJ IDEA,则可以将其完全集成。您可以让IDEA使用sbt连续编译您的项目,反之亦然,您可以使用sbt快速生成IDEA项目。如果您处于“快照”周期,并且依赖于您自己的其他库(从次要版本升级到次要版本),则最后一个选项非常有用-只需关闭项目,更新构建文件中的版本,然后重新运行gen-idea任务,然后重新打开项目:更新完成。
  • 谈到准备与你最需要的任务(compiletestrundocpublish-localconsole) -该console是最好的功能之一。
  • 有些人强调了依赖项可以是直接从GitHub获取的源存储库的功能。我没有用过,所以不能在这里发表评论。

有些人讨厌sbt,因为它使用Ivy进行依赖项管理(我无法评论它的优缺点,但大多数情况下它不是问题),有些人讨厌sbt,因为您用a来指定生成文件Scala DSL代替XML。有人对sbt的格式从v0.7更改为v0.10感到失望,但是很明显,如果您从头开始,迁移不会影响您。


27
我讨厌sbt,因为它滥用符号运算符和一些愚蠢的决定,例如都支持.sbt和.scala定义格式,但将它们放在不同的位置,.sbt中的语句必须至少用空行等分隔。的sbt正在改善,但目前还不够好。我最想念的是一些完整的(最小到真实世界的).sbt / .scala示例文件,逐行解释,涵盖了所有sbt功能。就是说,我每天都使用sbt,因为Maven会吸收更多。
xiefei 2012年

6
太可惜了这个问题没有解决,我相信事实之间也存在差异:例如,曼宁(Manning)关于SBT的书摘录:“如果Maven目标之间存在依赖关系(比如说一个目标产生的文件被另一个目标消耗)那么您将无法使用Maven并行化构建。使用sbt,您必须指定任务之间的显式依赖关系。这使sbt可以按默认值并行运行任务。如果任务A依赖于B,而C也依赖于B,则sbt运行任务B,然后并行运行A和C。” 希望此评论对一些读者有所帮助。
jhegedus 2014年

19
我发现此线程非常有用。我经常认为Stackoverflow主持人非常急于关闭线程。谁在乎他们是否经常是用户所寻找的东西(并通过网络搜索找到它们)时是否在“不在主题之外”。就像Stackoverflow Mod试图故意重新创建xkcd 979一样
Ville 2015年

3
@Ville我也有想法。否决,编辑和关闭变得过于激进。
ankush981 '16

2
对于现在正在查看此内容的任何人,@ xiefei的投诉已得到解决。SBT删除了许多自定义运算符/语法,并且/ sbt文件中的语句不再需要空格分隔。
Grogs
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.