写点什么

Gerrit 为何会选择 Buck

  • 2013-11-03
  • 本文字数:1649 字

    阅读完需:约 5 分钟

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,后者位于文件系统的某处:

复制代码
<pre>
java_library(
name = 'printy_lib',
srcs = glob(['src/main/java/**/*.java']),
deps = [':guava'],
)
prebuilt_jar(
name = 'guava',
binary_jar = 'guava.jar',
)
</pre>

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

复制代码
<pre>
include_defs('//lib/maven.defs')
maven_jar(
name = 'guava',
id = 'com.google.guava:guava:14.0',
sha1 = '67b7be4ee7ba48e4828a42d6d5069761186d4a53',
license = 'Apache2.0',
)
</pre>

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 描述页面](http://facebook.github.io/buck/)。
** 查看英文原文:**[Why Gerrit chose Buck](http://www.infoq.com/news/2013/10/gerrit-buck)
2013-11-03 08:411493
用户头像

发布了 88 篇内容, 共 266.8 次阅读, 收获喜欢 8 次。

关注

评论

发布
暂无评论
发现更多内容

搞定 XLSX 预览?别瞎找了,这几个库(尤其最后一个)真香!

沉浸式趣谈

飞算 JavaAI “智能引导” 功能:小白一天也能成为 Java 高手

飞算JavaAI开发助手

防火墙事件日志及日志分析

运维有小邓

日志管理工具 IT运维服务

SpecterInsight 4 - 基于 .NET 的跨平台后渗透指挥与控制 (C2) 框架

sysin

渗透

SANnav Management Portal 2.2.1 for ESXi - SAN 可视化管理软件

sysin

SANnav

使用华为开发者空间搭建WordPress博客平台

华为云开发者联盟

华为云 华为开发者空间

金仓数据库 2025 征文大赛火热启动!丰富豪礼 + 技术曝光,等你来战!

金仓技术

征文活动 金仓数据库

企业im有哪些? 哪款更适合你的即时通讯需求?

BeeWorks

即时通讯 IM 私有化部署 企业级应用

MySQL的高可用解决方案

陈一之

MySQL 高可用架构

Kubelet 可观测性最佳实践

观测云

Kubernetes

通义灵码入选 “2025 年值得关注的 AIGC 产品”,是唯一入选的 AI 编程产品

阿里云云效

阿里云 云原生 通义灵码

从重复编码到设计:飞算 JavaAI 助力程序员跳出「低阶陷阱」

飞算JavaAI开发助手

域名状态异常是怎么回事?怎么解决?(国科云)

国科云

我定制的通义灵码 Project Rules,用 AI 写出“更懂我”的代码

阿里巴巴云原生

阿里云 云原生 通义灵码

我定制的通义灵码 Project Rules,用 AI 写出“更懂我”的代码

阿里云云效

阿里云 云原生 通义灵码

从一棵树到一片森林:Mint Forest V3 正式上线!

NFT Research

blockchain web3

飞算 JavaAI 的 “高并发处理” 方案:如何应对流量高峰

飞算JavaAI开发助手

Studio 3T 2025.7 发布 - MongoDB 的终极 GUI、IDE 和 客户端

sysin

mongodb

即时编译助力金仓数据库KingbaseES分析能力飞跃

金仓技术

JIT 金仓数据库

如何基于 Kestrel 实现 socks5 代理

八苦-瞿昙

C# Proxy

QT 实现 C++ 数据类与 json 的转换

电子尖叫食人鱼

c++ qt

当KES高可用共享集群部署遇到文件系统损坏,该如何解决?

金仓技术

KingBase 金仓数据库

聊聊SpringAI流式输出的底层实现?

王磊

Acunetix v25.4 - Web 应用程序安全测试

sysin

Acunetix

k8s中资源限制 limit 和 request 的关系

陈德伟

k8s JVM Request Resource limit

通义灵码入选 “2025 年值得关注的 AIGC 产品”,是唯一入选的 AI 编程产品

阿里巴巴云原生

阿里云 云原生 通义灵码

MyBatis中的 10 个宝藏技巧!

量贩潮汐·WholesaleTide

Java 数据库 mybatis

VMware Cloud Director Availability 4.7.1 - 灾难恢复和迁移 (DRaaS 解决方案)

sysin

vmware

金仓数据库KingbaseES如何通过Hint影响执行计划

金仓技术

KingbaseES 金仓数据库

金仓数据库KingbaseES PAKCAGE的使用

金仓技术

KingBase 数据库· 金仓数据库

Kubernetes弹性扩容:助力AI大模型部署与运维的云原生实践

inBuilder低代码平台

Gerrit为何会选择Buck_语言 & 开发_Alex Blewitt_InfoQ精选文章