112

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

在 Scala 项目中偏爱 sbt 而不是 Gradle 的充分理由是什么?

4

5 回答 5

61

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

  • SBTIvy,带有一个修订版,可以作为固定版本(例如 1.5.2)或最新(或动态)版本给出。
    请参阅“ Ivy Dependency
    这意味着“-SNAPSHOT”机制支持可能会出现问题,尽管此线程中的Mark Harrah详细信息:

缓存确实会混淆,但 Ivy 不理解解析快照的说法是不正确的。Eugene 在另一个线程中解释了这一点,也许在管理员列表中。0.12 中解决了 sbt 的自动更新问题。

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

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

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

Mark 过去曾说过,他对使用 Gradle 代替 Ivy 进行 SBT 很感兴趣。

(两种工具可以互相学习

于 2012-06-16T17:01:43.520 回答
53

对我来说,SBT 的主要特点是:

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

缺点是:

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

sbt 是一个 Scala DSL,对它来说 Scala 是一等公民,所以原则上它似乎很合适。

但是 sbt 存在版本之间的主要不兼容更改,这使得很难为任务找到正确的工作插件并使其工作。

我个人放弃了 sbt,因为它造成的问题多于解决的问题。我实际上切换到gradle。

去搞清楚。

于 2012-06-16T08:51:43.740 回答
5

我对 gradle 还很陌生,对 sbt 也很陌生——到目前为止,我真正喜欢 sbt 的是交互式控制台。它允许我使用“检查”之类的命令来更好地了解正在发生的事情。AFAIK gradle 不提供这样的自动取款机。

于 2015-01-27T15:31:01.630 回答
-11

Sbt 和 gradle,两者都是基于静态类型语言....但是 sbt 几乎没有优势:

  • 更好的插件支持,特别是自动插件
  • 任务创建和任务之间的依赖管理
  • sbt 特别适合 scala 项目,因为它支持增量构建,并且大多数 sbt 本身是用 scala 编写的,而 sbt 构建定义是用 scala 编写的
  • sbt 有许多有用的内置任务的交互式 shell 支持
  • sbt 默认生命周期非常有用,新手可以轻松上手
于 2015-12-08T07:06:07.753 回答