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

Kon*_*tov 137 scala maven sbt

哪种构建工具最适合Scala?每个人的利弊是什么?如何确定在项目中使用哪一个?

mbl*_*inn 82

我们正在使用Maven来构建Scala项目,因为它与我们的CI服务器很好地集成.当然,我们可以运行一个shell脚本来启动构建,但是我们还有一些来自Maven的其他信息,我们想要进入CI.这是我能想到将Maven用于Scala项目的唯一原因.

否则,只需使用SBT.你可以访问相同的依赖项(真的是关于maven,恕我直言的最佳部分).您还可以获得增量编译,这是巨大的.能够在项目内部启动shell,这也很棒.

ScalaMock仅适用于SBT,您可能希望使用它而不是Java模拟库.最重要的是,扩展SBT 容易得多,因为你可以在构建文件中编写完整的scala代码,因此你不必经历编写Mojo的所有麻烦.

简而言之,只需使用SBT,除非您确实需要紧密集成到CI服务器中.

  • 我不同意上述任何内容,但只是想指出我正在编写[ScalaMock 3](http://www.paulbutcher.com/2012/06/scalamock-3-0) -preview-release /),其主要目标之一是使其他构建系统更容易支持. (21认同)
  • [scala-maven-plugin提供保存增量编译为SBT](http://davidb.github.com/scala-maven-plugin/example_incremental.html) (5认同)
  • 为什么他们不只是为maven编写增量编译?恕我直言,sbt是未经治疗的NIH综合征的典型例子...... (3认同)

0__*_*0__ 21

这个问题有可能产生很多意见; 最好有清晰的要求清单或环境描述,以前的知识等.

FWIW,这个scala邮件列表主题中有更多的意见.

我的2c是:如果你没有具体要求,请选择sbt

  • 对于简单的项目,它完全没有任何意义(除非你有依赖项,否则你甚至不需要构建文件)
  • 它通常用于Scala开源项目.您可以通过窥视其他人的项目轻松了解配置.此外,许多项目都假设您使用sbt并为您提供现成的复制+粘贴指令,以将它们添加为项目的依赖项.
  • 如果您使用IntelliJ IDEA,它可以完全集成.您可以让IDEA使用sbt来连续编译您的项目,反之亦然,您可以使用sbt快速生成IDEA项目.如果您处于"快照"循环中,并且依赖于您自己的其他库从次要版本到次要版本,那么最后一个非常有用 - 只需关闭项目,更新构建文件中的版本,重新运行gen-idea任务,并重新打开项目:完成更新.
  • 谈到准备与你最需要的任务(compile,test,run,doc,publish-local,console) -该console是最好的功能之一.
  • 有些人强调了依赖关系可以直接从GitHub获取的源存储库的功能.我没有用过这个,所以不能在这里发表评论.

有些人讨厌sbt,因为它使用Ivy进行依赖管理(我不能评论它的优点和缺点,但大多数时候它不是问题),有些人讨厌sbt因为你用a指定构建文件Scala DSL而不是XML.有些人对sbt的格式从v0.7更改为v0.10感到失望,但显然,如果从头开始,迁移不会影响你.

  • 我讨厌sbt,因为它滥用符号运算符和一些愚蠢的决定,例如支持.sbt和.scala定义格式,但将它们放在不同的位置,而.sbt中的语句必须至少用空行等分隔.文档sbt正在改善,但目前还不够好.我最想念的是一些完整的(最小到现实世界的复杂).sbt/.scala样本文件逐行解释,涵盖所有sbt功能.也就是说,我每天都使用sbt,因为Maven糟透了. (27认同)
  • 我发现这个帖子非常有用.我经常认为Stackoverflow主持人过于急切地关闭线程.当他们经常正是用户正在寻找的东西(并通过网络搜索找到)时,谁会关心他们是否"脱离主题".这就好像Stackoverflow mods试图故意重新创建[xkcd 979](https://xkcd.com/979/). (19认同)
  • 太糟糕了,这个问题已经结束,我确信也存在事实上的差异:例如,Manning关于SBT的书摘录:"如果Maven目标之间存在依赖关系(比如一个目标产生一个被另一个目标消耗的文件)然后你不能用Maven并行化你的构建.使用sbt,你必须指定任务之间的显式依赖.这使得sbt能够并行运行任务BY DEFAULT.如果任务A依赖于B,而C也依赖于B,那么sbt运行任务B,然后并行运行A和C." 希望这条评论能帮助一些读者. (6认同)
  • @Ville我的想法也是.Downvoting,编辑和关闭变得过于激进. (3认同)
  • 对于现在正在看这个的人来说,@ xiefei的投诉已得到解决.SBT已经删除了很多自定义运算符/语法,并且/ sbt文件中的语句不再需要空格分隔. (2认同)