Gerrit为何会选择Buck

来源:互联网 发布:mp3什么牌子比较好知乎 编辑:程序博客网 时间:2024/04/30 07:11

本文来源于我在InfoQ中文站翻译的文章,原文地址是:http://www.infoq.com/cn/news/2013/11/gerrit-buck


Shawn Pearce(Gerrit项目的维护者)在不久前的EclipseCon上发表了题为使用Buck改善Java构建的演讲(幻灯片、更多信息),该演讲谈到了Gerrit项目从Maven转移到Buck背后的原因。从Gerrit 2.8开始,项目的构建已经开始完全使用Buck了。

Buck是个构建系统,以Google的内部构建系统“blaze”为模型,它是由前Google,现Facebook工程师开发的。在Facebook,该构建系统是开源的,基于Apache许可,位于GitHub上。Buck基于Python构建,不过在Gerrit中它主要用来编译Java。

Buck语言是个DSL,使用Python作为底层构建文件。如下代码定义了一个名为“printy_lib”的Java库,它依赖于Guava,后者位于文件系统的某处:

java_library(  name = 'printy_lib',  srcs = glob(['src/main/java/**/*.java']),  deps = [':guava'],)prebuilt_jar(  name = 'guava',  binary_jar = 'guava.jar',)

Gerrit项目为从Maven Central中解析JAR提供了更多的支持,然后会将这些JAR下载到本地系统上。JAR的内容是通过一个GAV标识的,并使用SHA1校验,在下载时就会进行验证。目前Buck还没有这些扩展,不过未来可能会被加上。

include_defs('//lib/maven.defs')maven_jar(  name = 'guava',  id = 'com.google.guava:guava:14.0',  sha1 = '67b7be4ee7ba48e4828a42d6d5069761186d4a53',  license = 'Apache2.0',)

Buck相对于Maven的主要优势在于速度非常快。这是由几个关键特性所决定的,构建可以跨模块并行执行,默认情况下,Buck构建会执行1.25xCPU个线程(Maven与Make也有能力执行并行的构建,不过依旧是并行构建模块而已)。如下数据展示了Gerrit速度上的改进:

  • 清理构建
    mvn package -Dmaven.{javadoc,test}.skip=true  ... 6m50sbuck build :gerrit                            ... 2m 3sbuck test --all                               ... 2m 5s
  • 空操作增量重构建
    mvn package -Dmaven.{javadoc,test}.skip=true  ... 4m44sbuck build :gerrit                            ...    2s
  • Buck很快,当在后台运行buckd时会快
    ~/buck/bin/buckdtime buck :gerrit                             ...    0.5s

由于在默认情况下有多线程支持,Buck会通过增量构建,并且只重新编译那些改变的类来加快编译速度。相对于使用文件系统时间戳(并不是在所有系统上都是可靠的),Buck使用了基于代码上一次编译时间的SHA内容匹配来获悉哪些源文件被修改了。散列还包含了构建文件的散列,因此如果构建系统被修改了,那么所有文件都会被重新编译。

Buck还对Java关系有着详尽的了解,这样它就知道该如何构建相互依赖的类之间的关系,这可以确保只有在公共API发生变化时才会编译关系,而内部方法发生变化时则不会编译。

除了可以共享本地系统构建的内容外,我们还可以将Buck挂载到Apache Cassandra存储系统上,让多个开发者可以共享库。这成为了下载组件的一种仓库机制,这些组件可能已经被构建了,可能是老的版本,构建系统会解析这些情况。这样发现问题的速度就会大大加快,不必每次在解析了之前构建的内容后都要执行一次构建。由于内容是散列的,因此即便版本没有更新或者构建没有公开发布也可以执行构建。

速度上的提升可以实现更加灵活的开发。假如一个构建的执行时间不到一秒钟(如果运行着Gerrit daemon),Gerrit的开发构建会检测到它是否运行在开发模式下,然后对每次HTTP请求都会执行重新构建与重新加载。这样可以实现非常快的补丁修复与开发,无需花费数秒甚至是数分钟来执行重新构建与部署。

Buck依旧在开发当中,或许目前缺乏Gradle所拥有的一些社区与文档。最后,虽然Buck使用Java编写,不过它使用Python作为其DSL,测试主要在Mac与Linux上完成,这意味着目前的Windows支持被放在了第二位。

要想了解关于Buck的更多信息,请查看Facebook的Buck描述页面。

查看英文原文:Why Gerrit chose Buck

原创粉丝点击