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

gat*_*ado 50 eclipse scala build

我在这里看到过关于IDE的问题 - 哪个是Scala开发的最佳IDE?什么是模具的斯卡拉现状如何?,但我在IDE方面有过各种各样的经历.现在,我正在使用带有自动工作区刷新选项的Eclipse IDE,以及KDE 4的Kate作为我的文本编辑器.以下是我想解决的一些问题:

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

我看着Ant和Maven,虽然还没有使用过(我还需要花时间解决#3和#4).在我花时间让一个次优的构建系统工作之前,我想看看是否有人有其他建议.提前致谢!

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

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

Dan*_*wak 34

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

因此,构建仅修改过的文件几乎是不可能的.除了SDT之外,我所知道的唯一一个甚至尝试这个的工具是SBT(简单构建工具).它使用编译器插件在编译时跟踪文件,并查询编译器本身计算的依赖图.在实践中,这比重新编译世界的方法产生了大约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方面有点不合理,但那是因为一切都是如此简单,以至于很难在不感到啰嗦的情况下进行记录.您可以随时查看我的一个GitHub存储库以获取示例.祝好运!

  • Java的编译器将检查文件是否真正需要*重建,然后继续它.这是现代编译器的一个重要特征.在过去,我们可以使用Make的文件跟踪来防止GCC每次都重建*所有内容*.但是,像Java和Scala这样的语言允许文件之间存在循环和传递依赖关系,因此必须将它们组合在一起并在一个方面进行更改以强制重建另一个文件.斯卡拉在这个部门特别讨厌.简而言之,Make(和其他构建跟踪)不再足够,因此编译器必须是智能的. (20认同)
  • @Daniel Spiewak,"问题在于Scala的编译器对构建文件有点愚蠢.基本上,无论你是否真的需要构建文件,它都会构建你提供的任何东西." 我错过了什么吗?如果您指定要构建文件,编译器有时不会构建文件吗?在我看来好像编译器不应该决定需要构建什么 - 其他应用程序应该决定哪些文件需要提供给编译器. (7认同)

Bri*_*new 6

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

  • JetBrains最近推出了名为Community Edition的开源版IDEA.请参阅http://www.jetbrains.com/idea/free_java_ide.html.使用Scala插件可以正常工作. (6认同)
  • 虽然JetBrains(IntelliJ IDEA的制作人)为开源工作的开源开发者提供免费许可.我不确定这些限制是什么,但如果您特别想要IDEA,则可能值得调查. (3认同)
  • 商业IDE不适合我.不管怎么说,还是要谢谢你! (2认同)