BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

Gerrit为何会选择Buck

| 作者 Alex Blewitt 关注 4 他的粉丝 ,译者 张龙 关注 14 他的粉丝 发布于 2013年11月4日. 估计阅读时间: 6 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

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  ... 6m50s
    buck build :gerrit                            ... 2m 3s
    buck test --all                               ... 2m 5s
    
  • 空操作增量重构建
    mvn package -Dmaven.{javadoc,test}.skip=true  ... 4m44s
    buck build :gerrit                            ...    2s
    
  • Buck很快,当在后台运行buckd时会快
    ~/buck/bin/buckd
    time 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

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT