Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Scala项目中使用sbt与maven的利弊_Scala_Maven_Sbt - Fatal编程技术网

在Scala项目中使用sbt与maven的利弊

在Scala项目中使用sbt与maven的利弊,scala,maven,sbt,Scala,Maven,Sbt,哪个构建工具最适合Scala?它们各自的优缺点是什么?如何确定在项目中使用哪一个?我们使用Maven来构建Scala项目,因为它与CI服务器集成良好。当然,我们可以运行一个shell脚本来启动一个构建,但是我们从Maven中得到了很多其他的信息,我们想把这些信息放到CI中。这大概是我能想到的将Maven用于Scala项目的唯一原因 否则,只需使用SBT。您可以访问相同的依赖项(真的是maven、IMHO最好的部分)。您还可以得到增量编译,这是巨大的。能够在项目内部启动shell,这也是非常棒的

哪个构建工具最适合Scala?它们各自的优缺点是什么?如何确定在项目中使用哪一个?我们使用Maven来构建Scala项目,因为它与CI服务器集成良好。当然,我们可以运行一个shell脚本来启动一个构建,但是我们从Maven中得到了很多其他的信息,我们想把这些信息放到CI中。这大概是我能想到的将Maven用于Scala项目的唯一原因

否则,只需使用SBT。您可以访问相同的依赖项(真的是maven、IMHO最好的部分)。您还可以得到增量编译,这是巨大的。能够在项目内部启动shell,这也是非常棒的

ScalaMock只适用于SBT,您可能会希望使用它,而不是Java模拟库。除此之外,扩展SBT要容易得多,因为您可以在构建文件中编写完整的scala代码,所以您不必经历编写Mojo的所有繁琐过程


简而言之,除非您真的需要与CI服务器紧密集成,否则只需使用SBT即可。

这个问题有可能产生大量的意见;最好是有一个清晰的需求列表或对您的环境、以前的知识等的描述

FWIW,这里面有更多的意见

我的2c是:如果你没有具体的要求,就使用sbt

  • 对于简单的项目,它是完全不费吹灰之力的(在有依赖项之前,您甚至不需要构建文件)
  • 它通常在Scala开源项目中使用。您可以通过查看其他人的项目轻松了解配置。另外,许多项目假设您使用sbt,并为您提供了将它们作为依赖项添加到项目中的方法
  • 如果您使用IntelliJ IDEA,它可以完全集成。您可以继续编译项目,反之亦然,您可以使用sbt快速编译项目。如果您正处于一个“快照”周期,并且依赖于您自己的其他库,这些库从一个次要版本切换到另一个次要版本,那么最后一个非常有用——只需关闭项目,在构建文件中更新版本,重新运行
    gen idea
    任务,然后重新打开项目:更新完成
  • 提供您需要的大多数任务(
    编译
    测试
    运行
    文档
    本地发布
    控制台
    )-
    控制台是最好的功能之一
  • 一些人强调了一个特性,即依赖项可以直接从GitHub获取源存储库。我没有用过这个,所以不能在这里发表评论

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

我从Maven过渡到Scala项目的Gradle,因为它对多模块构建的卓越支持。推特和SBT被他们描述为“令人眼花缭乱的痛苦”,他们正试图摆脱它(Maven是这个过程中的权宜之计);我不知道是谁给了这些人任意决定是否结束一个问题的权力。我甚至不再注意他们是否接近了。幸运的是,在这个问题结束之前,我们有两个答案。对于那些投票结束这个问题的人来说,这太糟糕了……我并不反对上面的任何一点,但我只是想指出,我正在写这篇文章,其中的一个主要目标是让支持其他构建系统变得更容易。为了完整性,值得一提的是ScalaMock 2可以很好地与任何构建系统配合使用(它只是一个jar)只要您不需要使用生成的mock(即,只要您只需要模拟trait/接口).他们为什么不为maven编写一个增量编译?嗯,sbt是未经治疗的NIH综合征的一个原型…为什么sbt会导致CI出现问题?我讨厌sbt,因为它滥用符号运算符和一些愚蠢的决定,例如支持.sbt和.scala定义格式,但将它们放在不同的位置,并在.sb中声明t必须至少用空行隔开,等等。sbt的文档正在改进,但目前还不够好。我最怀念的是一些完整的(最小到现实世界的复杂).sbt/.scala示例文件逐行解释,涵盖了所有sbt功能。也就是说,我每天都使用sbt,因为Maven更糟糕。很遗憾,这个问题被解决了,我确信也存在事实上的差异:例如,这段摘录自Manning关于sbt的书:“如果Maven目标之间存在依赖关系(假设一个目标生成一个被另一个目标使用的文件)那么你不能用Maven并行化你的构建。使用sbt,你必须指定任务之间的显式依赖关系。默认情况下,这使sbt可以并行运行任务。如果任务a依赖于B,而C也依赖于B,那么sbt运行任务B,然后并行运行a和C。”希望这条评论能对一些读者有所帮助。我发现这条帖子非常有用。我经常认为Stackoverflow版主过于急切地关闭帖子。当他们经常是用户正在寻找的东西(并通过网络搜索找到)时,谁在乎他们是否“离题”呢。这就好像Stackoverflow mods也在试图有意地重新创建我的想法一样。@Ville我的想法。向下投票、编辑和关闭变得太激进了。对于现在看到这一点的任何人来说,@xiefei的抱怨已经得到了解决。SBT删除了更多的自定义运算符/语法,/SBT文件中的语句不再需要空格分隔符奥斯。