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

时间:2009-06-09 19:21:47

标签: eclipse scala build

我在这里看到过关于IDE的问题 - Which is the best IDE for Scala development?What is the current state of tooling for Scala?,但我对IDE有过不同的经验。现在,我正在使用带有自动工作区刷新选项的Eclipse IDE,以及KDE 4的Kate作为我的文本编辑器。以下是我想解决的一些问题:

  1. 使用我自己的编辑器 IDE非常适合每个人使用他们的组件。我更喜欢Kate,但刷新系统非常烦人(它不使用inotify,相反,可能是10s轮询间隔)。我不使用内置文本编辑器的原因是因为破坏的自动完成功能导致IDE挂起大概10秒。
  2. 仅重建已修改的文件 Eclipse构建系统已损坏。它不知道何时重建类。我发现自己几乎的时间去项目 - >干净。更糟糕的是,即使在它完成我的项目构建之后,几分钟后它会弹出一些奇怪的错误(编辑 - 这些错误似乎是以前用项目解决的事情>干净,但后来回来......)。最后,将“首选项/继续启动,如果项目包含错误”设置为“提示”似乎对Scala项目没有影响(即,即使存在错误也始终启动)。
  3. 构建自定义我可以使用“nightly”版本,但我想修改和使用我自己的Scala版本,而不是IDE插件中内置的编译器。将[例如] -Xprint:jvm传递给编译器(打印出降低的代码)也很好。
  4. 快速编译虽然Eclipse并不总是正确构建,但它确实看起来很快 - 甚至比fsc还要好。
  5. 我看了Ant和Maven,虽然还没有雇用(我还需要花时间解决#3和#4)。在我花时间让一个次优的构建系统工作之前,我想看看是否有人有其他建议。提前谢谢!

    UPDATE - 我现在正在使用Maven,将项目作为编译器插件传递给它。看起来足够快;我不确定Maven的缓存是什么样的jar。 Scala 2.8.0的当前存储库可用[link]。原型非常酷,跨平台支持似乎非常好。但是,关于编译问题,我不确定fsc是否实际修复,或者我的项目是否足够稳定(例如类名不会改变) - 手动运行它并不会让我感到烦恼。如果您想查看示例,请随意浏览我正在使用[github]的pom.xml文件。

    更新2 - 从我看过的基准测试中,Daniel Spiewak说得对,构建器的速度比Maven快(并且,如果正在进行增量更改,Maven的10秒延迟会变得很烦人),所以如果有的话可以制作一个兼容的构建文件,那么它可能是值得的......

8 个答案:

答案 0 :(得分:34)

点2和4 难以使用当前的scalac进行管理。问题是Scala的编译器对于构建文件有点愚蠢。基本上,它会构建您提供的任何内容,无论该文件是否真的需要构建。 Scala 2.8.0在这方面会有一些巨大的改进,但在那之前...... Eclipse SDT实际上有一些非常精细(和非常hackish)的代码用于进行变更检测和依赖性跟踪。总的来说,它做得不错,但正如你所看到的,有皱纹。 Eclipse SDT 2.8.0将依赖于对scalac本身的上述改进。

因此,构建仅修改过的文件几乎是不可能的。除了SDT之外,我所知道的唯一一个甚至尝试过这个的工具是SBT(Simple Build Tool)。它使用编译器插件在编译时跟踪文件,并查询编译器本身计算的依赖图。在实践中,这比重新编译世界的方法产生了大约50%的改进。再次,这是一个解决2.8.0之前的scalac缺陷的黑客。

好消息是,即使不担心变化检测,仍然可以实现合理快速的编译。 FSC使用Eclipse SDT用于实现快速增量编译的相同技术(噢,听起来像是“Charlie Eppes”)。简而言之,它非常活泼。

就个人而言,我使用Apache Buildr。它的配置比Maven或SBT更清洁,其启动时间少了几个数量级(在MRI下运行时)。它与FSC集成,并尝试自己进行一些基本的变化检测(相当原始)。它还对主要的Scala测试框架(ScalaTest,ScalaCheck和Spe​​cs)提供自动魔术支持,并支持使用Java源和IntelliJ和Eclipse的IDE元生成联合编译。哦,它支持所有Maven的功能(依赖解析等),然后一些。我甚至正在开发一个扩展,它允许与JavaRebel集成的交互式shell支持并支持几个shell提供程序(Scala,JIRB,Clojure REPL等)。它还没有为SVN做好准备,但是一旦它准备好了我就会做好准备(可能及时为1.3.5)。

正如您所看到的,我非常坚定地认为Buildr是最好的Scala构建工具。它的文档在Scala方面有点不合理,但那是因为一切都是如此简单,以至于很难在不感到啰嗦的情况下进行记录。您可以随时查看my GitHub repositories中的一个示例。祝你好运!

答案 1 :(得分:6)

你看过Intellij IDEA及其Scala integration吗? Intellij在Java开发人员中有忠诚(狂热?),因此您可能会发现这适合您的需求。

答案 2 :(得分:4)

我对Eclipse上的scala插件感到非常沮丧,我可以在列表中添加一些问题:

  • 自动完成仅在某些时候有效
  • 调试器无法正常工作(特别是在尝试调试scala xml时)
  • 调试器忘记断点
  • '去定义'不经常工作。

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

答案 3 :(得分:4)

如果您使用Emacs,我认为Ensime是一个非常好的IDE。我认为在撰写本文时,Ensime是唯一能够为您提供Scala和Java对象快速准确自动完成功能的IDE,包括隐式转换。

使用Speedbar进行代码浏览支持,使用优秀的Yasnippet进行代码模板,使用自动填充进行代码完成菜单。这些都是非常现代,积极维护的Emacs包。对于Maven和SBT,还有开箱即用的增量构建支持。

还有更多内容,例如交互式调试,重构和Scala解释器,这是一个劣质的过程。在Scala的现代IDE中你想要的所有东西都已经存在于Ensime中。强烈推荐给Emacsens。

答案 4 :(得分:4)

出于完整性的原因,我不得不说还有Pants - 在Twitter中使用的构建工具(早期的scala采用者之一)

它的主要区别在于它不仅适用于scala(顺便写入python),而是以google build system为模型。

它并不像sbt那么臃肿,所以对于新手来说它更简单,但我从来没有听说过Twitter和foursquare以外的Pants用法。

如果你害怕SBT,也许另一个不那么流行的构建工具ABT可能是你的替代吗?

答案 5 :(得分:3)

我走了同一条路,这就是我所在的地方: - 经过一些初步调查,我放弃了凯特。我喜欢在大多数事情上使用它,但是当涉及定义标签完成之类的东西时,我发现它非常缺乏。我建议你研究gedit,这对于Scala开发来说更加强大 - 使用gedit作为我的编辑器,我使用SBT并发现它是一个很棒的构建工具。我可以将它置于'测试'模式,当任何代码更改时,它重新编译相关文件并运行我的测试套件。这是一种非常有效的工作方式。

我还没看过Buildr。我想说我会,但老实说,SBT可供我使用,我真的没有必要去看另一个构建工具。

答案 6 :(得分:2)

如果你想使用Eclipse,但是使用sbt构建项目,并且仍然可以调试,请看这里的帖子:

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

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

答案 7 :(得分:1)

最新版本的Maven Scala插件支持Zinc / Nailgun,可缩短启动时间并提高构建速度。请参阅Zinc and Incremental Compilation