当 Ruby 比 Java 构建还快:Buildr

  • Sebastien Auvray
  • 张凯峰

2007 年 5 月 21 日

话题:JavaRubyDevOps语言 & 开发文化 & 方法

Java 构建系统 Maven 1.0 于三年前发布,并且已经在开源世界和行业内得到广泛采用;其后,2.0 新的发布却并没有得到同等的赞誉。与此同时,Ruby 变得越来越流行,而且通过像Rake这样的工具证明,内部 DSL 的概念是非常有效的。

另一方面,用通用语言编写的 DSL 即可运行。通过计算机所能达到的计算限度的扩展能力,你还能获得高级语言的简便性。
随着时间的过去,完全新的构建系统已由 Ruby 写成,比如BakeRant。还有些构件系统扩展了 Rake,比如Raven,像 Maven 一样它也支持外部存储。

在这些系统中有个新的加入者,Buildr,尤其致力于简化 Java 构建。作者 Assaf Arkin 提倡建立能精简 XML 化和过度工程化的解决方案,你可以在他的 blog或者他收集的tumblr引证中找到相关证据。这就是为什么他试图从他的项目中,比如Apache Ode,去掉 Maven2 的原因。



我们很快给它起了个绰号叫“Maven 不可靠原则”,虽然公平一点说,我们知道它并没有什么不可靠,或者只是怀疑这个构建是否会运行:它不会。但最终,也许有一天我们获得了足够多的理由。测试案例停止运行。(……)总之,我们不得不做出选择。是敏捷还是 Maven,必须使用它们其中的一个。

Assaf 曾想到回到 Ant:

于是我们开始想像没有 Maven 的幸福生活。也许我们应该转回到 Ant?即使它有那么多缺点,但至少 Ant 构建可以运行。当然,Ant 是不可声明的,而这是所有软件开发者的圣杯所在。但错误地使用声明性比任何套管程序(注:结构非常复杂的程序)还要糟糕。

……最终还是选择了 Rake。

因此我们做到了,开始使用 Rake。让我给你说说我的遭遇。Rake 被证明是个非常棒的选择,它是个好的开始,但这并不是我们原本所期望的。我们运行的典型 Java 应用由一些模块组成,所有模块都有相同的普通生命周期任务:编译、测试、打包、部署。为每一个模块一遍又一遍地编写那些代码使得这并不比 Ant 好多少。我们有了一个更好的办法。

传奇(Saga)导致了Buildr 的诞生,它具有容易实现的目标(也就是处理 XMLBeans),并允许你依据普通的 Ruby 代码来完成基本的任务。性能可能是阻止 Buildr 得到更广泛采用的最后障碍,但“快速而猛烈的”Buildr证明自己是能够和 Maven 竞争的
我们正在构建相同的代码,运行相同的测试,编译相同的 XMLBeans,创建相同的 Hibernate schemas,共享相同的远程和本地数据存储。所有的这些是想说明,它们是功能相当的黑盒。给它们相同的项目,他们就能产生相同的 JAR、WAR 和分发文件等。

它能构建相同的项目,但脚本从 52 个泛滥的 XML 文件缩减到只剩一个脚本,缩减率达 91%。但这还不是全部,Buildr 设法把构建时间减少了 50%!即使是部分构建,Buildr 执行也类似或好过 Maven。
当然,我们不是在估测原生的 Ruby 和纯 Java。我们在比较一种实现和另外一种实现,它们完成的是相同的任务,黑盒是相当的。这是一个真实的基准对比。

Assaf 以一个非常好的总结结束了采访:

Ruby 可能会比较慢,但你通过它构建的应用可能非常非常快。

我们可以想像,看到 Maven 和 Buildr 短兵相接是多么有趣的事情。

这篇文档目前仅限于 RDoc 和一个 Apache Rakefile 示例,但有个完整的指南正在编写中。

查看英文原文:When Ruby Builds Faster Than Java: Buildr
译者简介:张凯峰,在 Java 和 Web 开发方面略有心得,现在IBM 中国软件开发中心(CSDL) 从事 Lotus Forms 的 SVT、Automation 相关工作,曾参与译著《Ajax 实战》。与 InfoQ 中文站分享内容,请邮件至china-editorial@infoq.com
JavaRubyDevOps语言 & 开发文化 & 方法