什么是最佳的Scala构建系统?

50

在这里我看到了关于IDE的问题--哪个是Scala开发的最佳IDE?Scala工具的当前状态是什么?,但我对IDE有着各种各样的经验。目前,我正在使用自动工作区刷新选项的Eclipse IDE和KDE 4的Kate作为我的文本编辑器。以下是我想要解决的一些问题:

  1. 使用自己的编辑器 IDE实际上是面向每个人使用其组件的。我更喜欢Kate,但是刷新系统非常烦人(它不使用inotify,而是可能10秒轮询间隔)。我不使用内置文本编辑器的原因是损坏的自动完成功能会导致IDE挂起大约10秒。
  2. 只重建修改的文件 Eclipse构建系统存在问题。它不知道何时重新构建类。我发现自己几乎有一半的时间都要去project->clean。更糟糕的是,即使它已经完成了项目的构建,几分钟后它也会弹出一些奇怪的错误(编辑 - 这些错误似乎是以前通过project>clean解决的问题,但后来又出现了...)。最后,将“首选项/如果项目包含错误则继续启动”设置为“提示”似乎对Scala项目没有影响(即使有错误也总是启动)。
  3. 构建自定义 我可以使用“夜间”版本,但我想要修改并使用自己的Scala构建,而不是内置到IDE插件中的编译器。还可以将[例如] -Xprint:jvm传递给编译器(以打印降级代码)。
  4. 快速编译 尽管Eclipse并不总是构建正确,但它似乎很迅速--甚至比fsc还要快。

我看过Ant和Maven,但还没有使用过任何一个(在解决#3和#4之前也需要花时间)。我想在我把不太理想的构建系统搞定之前看看是否有其他建议。提前感谢!

更新 - 我现在正在使用Maven,将项目作为编译器插件传递给它。它似乎足够快;我不确定Maven进行了什么类型的jar缓存。Scala 2.8.0的当前仓库可用[链接]。原型非常酷,跨平台支持似乎非常好。但是,关于编译问题,我不确定fsc是否实际上已经修复,或者我的项目是否足够稳定(例如类名称不会改变)-手动运行它不会太困扰我。如果您想看一个示例,请随意浏览我正在使用的pom.xml文件[github]。

更新2 - 根据我看到的基准测试,Daniel Spiewak是正确的,buildr比Maven更快(如果进行增量更改,则Maven的10秒延迟很烦人),因此如果可以制定兼容的构建文件,则可能值得尝试...


1
问题应该更改为“这些狭窄要求下最好的Scala构建系统是什么”。您给出的标准使得这个泛泛的问题非常具体化,符合您的个人喜好。我想我的抱怨是您占据了泛泛的问题的最佳标题。幸运的是,其中一些答案是通用的。 - user23987
因为这是一个“最好的是什么”的问题,你能加上[主观]标签吗?我不是故意要刁难你,真心的;) - user23987
在关于“这些狭窄要求下最好的Scala构建系统是什么”的问题上,我添加了主观标签。我认为这些并不是狭窄的要求。任何好的构建系统都应该快速、模块化(如果必要的话,独立于IDE),并允许使用任何底层选项(在这种情况下是Scala编译器)。添加标准可以确保回答者考虑重要的特性,而不是建议他们所用过的最简单的编译器。 - gatoatigrado
8个回答

34

目前的scalac编译器在处理第2点和第4点时非常困难。问题在于Scala编译器在构建文件方面有些愚蠢。基本上,它会构建任何你提供给它的文件,而不管该文件是否真正需要被构建。Scala 2.8.0将在这方面有一些巨大的改进,但在那之前... Eclipse SDT实际上有一些非常复杂(也非常hackish)的代码来进行更改检测和依赖跟踪。总体而言,它做得还不错,但正如你所看到的,还有些问题。Eclipse SDT 2.8.0将依赖于前述的scalac本身的改进。

因此,仅构建修改过的文件几乎是不可能的。除了SDT之外,我知道的唯一尝试这样做的工具是SBT(Simple Build Tool)。它使用编译器插件来跟踪文件在编译时的情况,并查询编译器本身计算的依赖关系图。实际上,这比重新编译整个项目可以提高约50%的效率。再次强调,这是一个hack,以解决pre-2.8.0 scalac的缺陷。

好消息是,即使不考虑更改检测,仍然可以实现相当快的编译。FSC使用与Eclipse SDT相同的技术(哦,听起来像是“Charlie Eppes”),以实现快速增量编译。简而言之,它非常迅速。

个人而言,我使用 Apache Buildr。它的配置比Maven和SBT都要干净得多,并且启动时间少了好几个数量级(当在MRI下运行时)。它集成了FSC,并尝试自己进行一些基本的更改检测(相当原始)。它还具有自动支持主要的Scala测试框架(ScalaTest,ScalaCheck和Specs)以及支持与Java源代码的联合编译和用于IntelliJ和Eclipse的IDE元生成功能。噢,它还支持Maven的所有功能(依赖项解析等),而且还有更多的功能。我甚至正在开发一个扩展程序,允许与JavaRebel集成的交互式Shell支持,并支持几个Shell提供程序(Scala、JIRB、Clojure REPL等)。它还没有准备好发布到SVN上,但一旦准备好了(可能会在1.3.5版本中),我会提交。

可以看出,我坚信Buildr是最好的Scala构建工具。它在Scala方面的文档有点不足,但这是因为一切都是如此简单明了,难以在没有感觉啰嗦的情况下记录文档。您可以随时查看我的GitHub代码库的示例。祝您好运!


谢谢,但似乎fsc甚至从命令行都给我带来了麻烦。目前,我将坚持重新编译整个程序的方法,因为这实际上可以正确编译(唉...)。当fsc开始工作时,我会尝试buildr。 - gatoatigrado
7
“问题在于Scala编译器在构建文件方面有些愚蠢。基本上,它会构建你提供的任何内容,不管该文件是否真正需要构建。”我有所遗漏吗?如果指定要构建文件,编译器有时候不应该构建它们吗?在我看来,编译器不应该决定哪些需要构建或不需要构建 - 其他某个应用程序应该决定哪些文件需要提供给编译器。 - Onorio Catenacci
20
Java的编译器会在继续构建之前检查文件是否真正需要重新构建。这是现代编译器的一个重要特性。在过去,我们可以使用Make的文件追踪来防止GCC每次都重新构建所有东西。然而,像Java和Scala这样的语言允许文件之间存在循环和传递依赖关系,需要将它们一起构建,并且对一个文件所做的更改会强制重新构建另一个文件。Scala在这方面尤为棘手。简而言之,Make(以及其他构建跟踪工具)已经不再足够,因此编译器必须变得更加智能。 - Daniel Spiewak
1
@Daniel Spiewak,谢谢你为我澄清这个问题。我以为我可能漏了什么。 - Onorio Catenacci
1
Buildr听起来很有趣,但我觉得不方便必须下载和安装另一种语言(Ruby)才能获得构建不同语言源代码的工具。好吧,它可以被视为另一个二进制依赖项,但这仍然让我感到烦恼。 - PhiLho
1
Buildr的安装很麻烦。不仅需要安装“Ruby”,还要处理它的侧向错误和与不同操作系统的兼容性问题。 - Andriy Drozdyuk

6

您是否看过Intellij IDEA及其Scala集成?Intellij在Java开发者中拥有忠诚的(狂热的?)追随者,因此您可能会发现这对您的需求很合适。


2
商业集成开发环境对我来说不是一个选择。无论如何,还是谢谢! - gatoatigrado
3
尽管JetBrains(IntelliJ IDEA的生产者)向开源开发人员提供免费的开源工作许可证,但我不确定限制是什么。但如果你特别想要使用IDEA,那么调查一下可能是值得的。 - mcherm
6
JetBrains最近推出了名为Community Edition的IDEA开源版。请参阅http://www.jetbrains.com/idea/free_java_ide.html。与Scala插件完美配合。 - Juha Syrjälä
IDEA不允许你进行测试,但是可以通过以下链接解决:http://youtrack.jetbrains.net/issue/SCL-1958?projectKey=SCL我删除了Scala 2.7的ScalaTest支持。在Scala 2.8发布后,我将删除所有使用Scala 2.7的可能性。对此给您带来的不便深感抱歉。当我们开始支持Scala 2.8时,没有考虑到Scala 2.7是一个巨大的错误。但现在,Scala 2.7存在部分和糟糕的支持问题,因此我认为我们应该将其删除。请使用以前的版本,在没有IDEA的情况下运行测试,使用Scala 2.7 ScalaTest运行器自己构建插件,或将您的项目迁移到Scala 2.8。 - Will Sargent
1
这个问题已经解决了 - 你可以在 IDEA 11 和 12 中进行良好的测试。 - sourcedelica
另外,IDEA 12支持使用SBT进行构建,速度相当快。 - sourcedelica

4
为了完整起见,我必须说还有Pants--这是Twitter使用的构建工具(最早采用scala之一)。
主要区别在于它不仅用于scala(顺便说一句,它是用Python编写的),并且是模仿Google构建系统
它没有sbt那么臃肿,所以对于新手来说更加简单,但我从未听说过Pants在Twitter和foursquare之外的使用。
如果你害怕SBT,也许另一个不太流行的构建工具ABT可以成为你的选择

4
如果您使用Emacs,我认为Ensime是一个非常好的IDE。在撰写本文时,我认为Ensime是唯一一个可以快速准确地为Scala和Java对象(包括隐式转换)提供自动完成的IDE。
使用Speedbar进行代码浏览支持,使用优秀的Yasnippet进行代码模板,使用Autocomplete进行代码完成菜单。这些都是非常现代化的、经过积极维护的Emacs软件包。还有开箱即用的Maven和SBT增量构建支持。
此外,还有交互式调试、重构和Scala解释器等功能。Ensime已经具备了现代Scala IDE所需的所有功能,强烈推荐给Emacs用户使用。

听起来不错;虽然我碰巧是一个vim用户... - gatoatigrado

4

我对Eclipse上的Scala插件感到非常沮丧,以下是我遇到的一些问题:

  • 自动补全只能有时候使用
  • 调试器无法正常工作(特别是在尝试调试Scala XML时)
  • 调试器会忘记断点
  • “转到定义”通常不起作用。

很高兴听到Buildr听起来是一个更好的选择(至少在构建方面),我会尝试一下 - 谢谢!


2
请注意,此答案非常老,而Eclipse插件现在非常好用。http://scala-ide.org/ - James Moore

3
我也曾经走过同样的道路,现在我可以分享一下我的经验: - 在进行了一些初步调查后,我放弃了使用 Kate。虽然我喜欢用它来完成大部分任务,但是当涉及到定义选项卡自动补全之类的功能时,我发现它明显不足。我建议你改用 gedit,这款编辑器对于 Scala 开发更加强大可靠。 - 使用 gedit 作为编辑器,我使用 SBT 作为构建工具,发现它非常好用。我可以将其置于“测试”模式下,当代码发生任何更改时,它会重新编译相关文件并运行测试套件。这是一种非常有效的工作方式。
- 我还没有看过 Buildr。虽然我想说我会去看看它,但实际上,由于已经有了 SBT,我并没有真正需要另一个构建工具。

2
如果您想使用Eclipse,但是使用sbt构建项目,并且仍然能够进行调试,请查看此处的帖子:

zikaprog.wordpress.com/2010/04/19/scala-eclipse-sbt-and-debugging/

它也可以应用于除了sbt之外的构建工具。

Eclipse Scala IDE的当前版本正在使用sbt进行构建,供您参考。 - James Moore
这个答案是2.5年前写下的,但是看到有人更新互联网总是很好的!谢谢! - Roland

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接