Scala 比较sbt和Gradle

Scala 比较sbt和Gradle,scala,sbt,gradle,Scala,Sbt,Gradle,我潜入斯卡拉,注意到了sbt。我对Gradle在java/groovy项目中的表现非常满意,我知道Gradle有一个scala插件 在Scala项目中,有什么好的理由支持sbt而不是Gradle?sbt是Scala DSL,而且Scala是一等公民,因此从原则上讲,它似乎很适合 但是sbt在版本之间存在重大的不兼容变化,这使得它很难为任务找到正确的工作插件并使其工作 我个人放弃了sbt,因为它带来的问题比解决的问题还多。我真的换成了格拉德尔 如图所示。对我来说,SBT的主要功能是: 快速编译(

我潜入斯卡拉,注意到了sbt。我对Gradle在java/groovy项目中的表现非常满意,我知道Gradle有一个scala插件


在Scala项目中,有什么好的理由支持sbt而不是Gradle?

sbt是Scala DSL,而且Scala是一等公民,因此从原则上讲,它似乎很适合

但是sbt在版本之间存在重大的不兼容变化,这使得它很难为任务找到正确的工作插件并使其工作

我个人放弃了sbt,因为它带来的问题比解决的问题还多。我真的换成了格拉德尔


如图所示。

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

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

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

请注意,SBT和Gradle之间的一个关键区别是其依赖关系管理

  • :,带有一个修订版本,可以作为固定版本(例如1.5.2)或最新版本(或动态版本)给出。
    请参阅“”
    这意味着“-SNAPSHOT”机制支持可能会有问题,即使以下详细信息:
缓存确实会变得混乱,但Ivy不理解解析快照并不是真的。Eugene在另一个线程中解释了这一点,可能在管理员列表中。sbt的自动更新在0.12中解决了一个问题

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

  • :提及():
让您知道,Ivy和Maven快照依赖关系的问题是Gradle最终用自己的依赖关系管理代码取代Ivy的原因之一。这是一项艰巨的任务,但给我们带来了许多好处

提到未来所有情况都可能发生变化:

马克过去曾表示,他有兴趣在SBT中使用Gradle而不是常春藤


(这两种工具都可以)

我对gradle是相当陌生的,对sbt也是非常陌生的-到目前为止,我真正喜欢sbt的是交互式控制台。它允许我使用像“inspect”这样的命令来更好地了解正在发生的事情。AFAIK gradle不提供类似于此atm的功能。

Sbt和gradle都基于静态类型语言……但Sbt的优势不多:

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

从某种意义上讲,SBT就像一个Vim:如果你喜欢它,你会很高兴的。顺便说一句,还有maven和lein(是为clojure创建的,但也与scala一起工作)。不要觉得有压力去SBT。Scala社区的一些知名成员使用Gradle。相反,使用SBT作为实验,知道你可以用Gradle代替。谢谢大家。。。读了你的见解后,我会继续读格雷德的。在我看来,当我们把Maven抛在身后时,JVM领域的大多数构建工具工作都将在这里进行。令人恼火的是,这个问题在这里被标记为“基于意见”,可能是那些不经常在JVM领域工作的人(因此缺乏监督)。下面的答案是真实的,没有圣战主义的。不,这些答案主要是对可检验事实的陈述,而不是观点。虽然这个问题可能会吸引无用的答案,但事实上,它并没有这样做。据我所知,只有一个非常重要的变化:当sbt从0.7.x切换到0.1.xi时,如果您使用sbt 0.11.2的插件,然后转到sbt 0.12,则需要等待插件作者编译新版本或自己编写。idea sbt就是一个例子。@fmpwizard sbt 0.12行还没有实现。。。停止传播FUD。不是sbt不可能使用,而是我们的团队使用它。但我的评论是支持这个答案,它说“……但是sbt在版本之间存在重大的不兼容变化,这使得它很难为任务找到正确的工作插件并使其工作……”正如你所注意到的,我不能只使用scct插件,我必须修改它(是的,这是一个很小的改动,但后来我不得不将它发布到某个地方,这样我的整个团队都可以访问它)毫无理由的痛苦。你能使用gradle对不同的Scala版本进行交叉编译吗?我是否正确认为,由于Scala向后二进制不兼容的问题,存在/曾经需要交叉编译/发布功能?是的。当移到Scala 2.10时,这些问题可能会再次发生。还有两个di我要补充的区别:*在SBT中,自我管理依赖性更容易,依我看。*SBT测试运行程序似乎更快;我怀疑这里涉及到一些狡猾的并发性,但我猜。SBT似乎是一个功能更强但不太成熟的产品。+1表示“象形语法”的缺点。这是我最大的抱怨