比较sbt和Gradle [关闭]


110

我正在深入Scala并注意到sbt。我对Java / groovy项目中的Gradle感到非常满意,而且我知道Gradle有一个Scala插件。

在Scala项目中,为什么sbt胜过Gradle的充分理由是什么?


从某种意义上说,SBT就像Vim:如果您轻视它,就会感到满意。顺便说一下,还有Maven和Lein(是为Clojure创建的,但也可以与Scala一起使用)。
om-nom-nom 2012年

18
过渡到SBT并没有压力。Scala社区的一些知名成员使用Gradle。相反,请使用SBT作为实验,知道您可以改用Gradle。
Daniel C. Sobral 2012年

6
谢谢大家...阅读您的见解后,我会坚持使用Gradle。在我看来,随着我们离开Maven,这将是JVM空间上大多数构建工具的工作所在。
汉斯·韦斯特贝克

10
令人讨厌的是,这个问题在这里被标记为“基于观点的”,这可能是因为那些一直不在JVM空间工作的人(因此缺乏监督)。下面的答案是事实,没有圣战主义的答案。
汉斯·韦斯特贝克

4
不,这些答案主要是可检验事实的陈述,而不是观点。尽管这个问题可能会吸引无用的答案,但实际上并没有这样做。它应该保持开放状态,作为对工具之间实际差异的有用描述。
erickson

Answers:


61

请注意,SBT和Gradle之间的主要区别在于其依赖项管理

  • SBTIvy,具有一个修订版本,可以作为固定版本(例如1.5.2)或最新版本(或动态版本)给出。
    请参阅“ 常春藤依赖 ”,
    这意味着“ -SNAPSHOT”机制支持可能会出现问题,即使Mark Harrah此线程中有详细说明:

确实,缓存可能会造成混乱,但是常春藤不了解解析快照的情况并非如此。尤金在另一个话题中解释了这一点,也许是在管理员列表上。sbt的自动更新存在一个问题,已在0.12中解决。

据我所知,Ivy不支持以Maven的方式发布快照。我相信我已经在其他地方说过了,但是如果有人想改善这种情况,我的观点是最好与Gradle团队合作重用他们的依赖管理代码。

只是要让您知道,Ivy和Maven快照依赖项的问题是Gradle最终用其自己的依赖项管理代码替换Ivy的原因之一。这是一项艰巨的任务,但给我们带来了很多好处。

此推文提到将来所有情况都可能发生变化:

马克过去说过,他对使用Gradle代替Ivy进行SBT感兴趣。

(两种工具都可以互相学习


1
我遇到的最大不便是sbt,您无法指定每次提及该规则时都不要重新编译的规则。Java和Scala的内置规则具有此功能,但未编写自定义规则。因此,每次生成程序文件或文档时,即使您生成jar文件,也将在每次调用时执行任务,而不管对源所做的任何实际更改。即使make足够聪明,但也没有sbt
ayvango

1
@ayvango如今的sbt并非如此。有许多使用此功能的插件,例如android-sdk-plugin
dant3

您知道该功能使用了什么API吗?
ayvango 2015年

所以与Maven和Gradle相比,这是常春藤所缺少的吗?这很奇怪
Tribbloid

53

对我来说,SBT的主要功能是:

  • 快速编译(比更快fsc)。
  • 连续编译/测试:~test每次保存修改后,该命令将重新编译并测试您的项目。
  • 跨多个scala版本进行交叉编译和交叉发布。
  • 具有正确的scala版本兼容性的自动检索依赖项。

缺点是:

  • 一种象形的语法,倾向于阻止新用户(特别是如果他们来自Java)
  • 没有简单的方法来定义“任务”:如果您需要特殊的构建过程,则需要找到一个插件,或者自己编写一个插件。

由于Scala向后二进制不兼容的问题,我是否正确/是否需要交叉编译/发布功能?
汉斯·韦斯特贝克

1
是。当移至Scala 2.10时,这些问题可能再次发生。
范式

1
我还要添加另外两个区别:*在SBT中,更易于自我管理依赖性IMO。* SBT测试运行程序似乎更快;我怀疑这里涉及到一些狡猾的并发,但我猜是这样。SBT似乎是一种功能更强大但较不成熟的产品。
Rick-777

25
为“象形语法”的缺点+1。那是我最大的SBT苦恼。操作员超载总是会导致滥用:-/
Ron Dahlgren

7
神秘的SBT语法带来了scala中最糟糕的东西。Gradle基于深思熟虑的领域模型和简单明了的语法。
nemoo

40

sbt是Scala DSL,对于它来说,Scala是一流的公民,因此从原则上讲,这似乎是一个不错的选择。

但是sbt遭受版本之间重大不兼容更改的困扰,这使得很难为任务找到正确的工作插件并使之正常工作。

我个人放弃了sbt,因为它引起的问题超出了解决的范围。我实际上切换到了gradle。

去搞清楚。


2
据我所知,只有一个非常重大的变化:当sbt从0.7.x切换到0.1.x时
om-nom-nom

1
如果您将插件用于sbt 0.11.2,然后转到sbt 0.12,则需要等待插件作者编译新版本或自己完成。idea-sbt是一个示例。
fmpwizard,2012年

4
@fmpwizard尚未实现sbt 0.12行...停止传播FUD。
范式

3
sbt不是不可能使用,我们的团队正在使用它。但是我的评论是支持这个答案,它说:“ ...但是sbt遭受版本之间的重大不兼容更改,这使得很难为任务找到正确的工作插件并使之正常工作……”就像您注意到的那样,我不能只使用scct插件,我必须对其进行修改(是的,但有一点点改动,但是我不得不将其发布到某个地方,以便我的整个团队都可以访问它)。
fmpwizard,2012年

3
您是否可以使用gradle对不同的Scala版本进行交叉编译?
町筋2014年

4

我对于gradle来说是个新手,对于sbt来说还是个新手-到目前为止,我最喜欢sbt的地方是交互式控制台。它使我可以使用“检查”之类的命令来更好地了解正在发生的事情。AFAIK gradle不提供此类atm。


-11

Sbt和gradle都基于静态类型的语言.....但是sbt有一些优点:

  • 更好的插件支持,特别是自动插件
  • 任务创建和任务之间的依赖关系管理
  • sbt特别适合于scala项目,因为它支持增量构建,并且大多数sbt本身是用scala编写的,而sbt构建定义是用scala编写的
  • sbt具有交互式shell支持以及许多有用的内置任务
  • sbt默认生命周期非常有用,并且可以以更少的精力使新手入门

1
Gradle基于不是静态类型语言的groovy。
Vistritium

Gradle在任务之间进行依赖管理,创建任务尽可能简单,我不知道写一个插件要比gradle更容易,因为gradle可能需要groovy,Java,gradle插件甚至更多。
Johnride
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.