在Scala项目中使用sbt和maven的优缺点

152

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


5
为了更好地支持多模块构建,我从Maven转向Gradle作为Scala项目的构建工具。Twitter在使用SBT时经历了“令人眼花缭乱的痛苦”,他们正在尝试摆脱它(在这个过程中暂时使用Maven)。 - Ben Manes
38
另一个很酷的封闭式问题... - Cedric H.
20
我看到很多好问题都被关闭了,我不知道是谁给了这些人权力去随意决定是否关闭一个问题。我已经不再关注它们是否被关闭了。 - user1888243
3
同意。幸运的是,在这个问题关闭之前,我们有两个答案。那些投票关闭这个问题的人很可怜... - hqt
https://manuel.bernhardt.io/2018/04/19/quick-tour-build-tools-scala/ https://www.lihaoyi.com/post/SowhatswrongwithSBT.html - Dmytro Mitin
2个回答

92

我们在工作中使用Maven来构建Scala项目,因为它能够很好地与我们的CI服务器集成。当然,我们也可以运行一个shell脚本来启动构建,但是我们需要从Maven获取其他的信息并进入CI系统,这是唯一我能想到使用Maven的理由。

否则,只需使用SBT即可。你可以访问相同的依赖项(实际上是Maven最好的部分,以我的经验而言)。你还可以获得增量编译,这非常重要。还可以在项目内部启动shell,这也非常棒。

ScalaMock仅适用于SBT,并且您可能希望使用它而不是Java模拟库。此外,由于您可以在构建文件中编写完整的Scala代码,因此扩展SBT要容易得多,无需通过编写Mojo来完成繁琐的过程。

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


22
我不反对以上任何观点,但是我想指出我正在编写ScalaMock 3,其主要目标之一是使支持其他构建系统更加容易。 - Paul Butcher
1
仅为完整起见,值得一提的是,只要您不需要使用生成的模拟对象(即只需要模拟 traits/interfaces),ScalaMock 2 就可以与 任何 构建系统(它只是一个 jar)完美配合。 - Paul Butcher
6
scala-maven-plugin提供了类似SBT的增量编译保存功能。具体内容请参见:http://davidb.github.com/scala-maven-plugin/example_incremental.html - Nikita Volkov
3
为什么他们不为Maven编写一个增量编译器呢?在我看来,sbt是未被治疗的“非本人开发”综合征(NIH syndrome)的典型例子。 - Cpt. Senkfuss
1
由于SBT,CI出现问题的原因是什么? - Daniel
显示剩余2条评论

22

这个问题很容易只产生许多意见;最好有一个清晰的要求列表或者环境描述, 先前的知识等

FWIW,这个Scala邮件列表线程中有更多的意见。

我的建议是:如果您没有特定的需求,请使用sbt

  • 对于简单的项目,它是完全无障碍的(在您拥有依赖项之前,甚至不需要构建文件)
  • 它广泛应用于Scala开源项目中。您可以通过查看其他人的项目,轻松了解配置。此外,许多项目假定您使用sbt,并为您提供添加到项目依赖的即用型复制+粘贴指令.
  • 如果您使用IntelliJ IDEA,它可以被完全集成。您可以让IDEA使用sbt来持续编译您的项目,反之亦然,您可以使用sbt快速地生成IDEA项目。如果您处于依赖于自己的其他库的“快照”循环中,这个功能非常有用,其中这些库从次要版本升级到次要版本 -- 只需关闭项目,在构建文件中更新版本,重新运行gen-idea任务,然后重新打开项目:更新完成。
  • 几乎包含您需要的大多数任务(compiletestrundocpublish-localconsole)-- console是最好的特性之一。
  • 有些人强调了一个特点,即可以直接从GitHub抓取源代码存储库作为依赖项。我没有使用过,所以在这里不能发表评论。

一些人讨厌sbt,因为它使用Ivy进行依赖管理(我无法评论其优缺点,但大多数情况下这不是问题),还有一些人讨厌sbt,因为你需要使用Scala DSL而不是XML来指定构建文件。一些人对sbt的格式从v0.7到v0.10的更改感到失望,但显然,如果您从头开始,迁移就不会影响您。


30
我讨厌sbt,因为它滥用符号操作符和一些愚蠢的决定,例如同时支持.sbt和.scala定义格式但将它们放在不同的位置,以及.sbt中的语句必须至少间隔一行等等。sbt的文档正在改进,但目前还不够好。我最想要的是一些完整(从最简单到现实世界复杂)的.sbt/.scala示例文件,逐行解释,涵盖所有sbt功能。也就是说,尽管Maven更糟糕,但我每天仍在使用sbt。 - xiefei
6
很遗憾这个问题已经关闭了,我相信实际上也存在一些差异:例如曼宁的书中关于SBT的这段摘录:“如果Maven目标之间存在依赖(比如一个目标生成一个文件,另一个目标使用该文件),那么你不能使用Maven并行构建。 但是使用sbt,您必须在任务之间指定明确的依赖关系。这使得sbt能够默认并行运行任务。如果任务A依赖于B,C也依赖于B,则sbt会先运行任务B,然后并行运行任务A和C。” 希望这条评论可以帮助一些读者。 - jhegedus
29
我发现这个帖子非常有用。我经常认为Stackoverflow的管理员过于急于关闭帖子。当它们往往正是用户正在寻找并通过网络搜索找到的内容时,谁会在意它们是否“离题”呢?就像Stackoverflow的管理员故意再现xkcd 979一样。 - Ville
4
我的想法也是如此。现在对于下投票、编辑和关闭的处理变得太过激烈了。 - ankush981
6
针对现在查看此内容的任何人,@xiefei的抱怨已得到解决。SBT已经放弃了许多自定义运算符/语法,并且/sbt文件中的语句不再需要空格分隔。 - Grogs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接