Meta开源内部使用的高性能大规模构建系统Buck2

Meta开源内部使用的大型构建系统Buck2,该系统以Rust编写,其构建速度是第一代Buck1的2倍,可供开发者更快速地进行程序迭代。Buck2的特色在于完全分离核心与语言规则,具有更高的平行性,集成远程执行和虚拟文件系统,并且重新设计了控制台输出。

Meta之所以如此重视构建系统,甚至将Buck1彻底重构的原因,官方提到,更快速且高效的构建系统将直接提高开发人员的效率。因此Meta重新设计出大规模构建系统Buck2,目的是要进一步提升开发人员的生产力。

Meta在设计Buck2时,仅保留了Buck1的核心概念以及工作流程,其余完全重写,而Buck2的一大特色便是完全分离核心与语言规则,这与Buck1和类似的系统Bazel有很大的不同,Buck1是把所有语言规则都写在核心中,而Bazel也是将C++、Java语言规则写在核心中。

Buck2的核心是以Rust开发,而像是构建C++等语言规则是以Starlark编写,Buck2将核心与语言规则分开,使得规则更容易改变和理解,当需要支持新语言或是更改既有语言规则时,维护人员仅需要专注于特定语言模块,不需要彻底重构整个系统。

分离核心和语言规则能够更有效地降低系统复杂性,维护人员可以更好地理解、修改和维护各部分,在不影响整体运行的情况下,独立更新特定语言规则,不只降低错误风险,也提高了整体开发速度。

除此之外,与Buck1和Bazel相比,Buck2构建系统使用单一增量相依图(Dependency Graph)驱动构建过程,因而改善了多阶段性构建带来的问题。Buck2在整个构建过程,只会有一个相依图,随着开发过程进展增量更新,不仅能够有效关注程序代码更改和相依项目变更,也能确保只对有变化的部分重新编译和连接。

由于在传统构建系统的构建过程,经常存在包括编译、连接等多个阶段,这些阶段有先后顺序,期间还会产生中间产物,因此Buck2没有阶段构建的特性,代表着构建过程更简单且高效率。Buck2的执行速度非常快速,明显快过Buck1,在没有程序代码变更的情况下,Buck2几乎能够即时处理后续构建工作,即便有许多工作需要执行,Buck2的平行性运算优势也能大幅加速构建。

Buck2良好支持远程执行,使用与Bazel相同的API,可在远程机器上运行,且Buck2和虚拟文件系统集成,不会签出(Checked out)整个存储库,而是仅按需访问文件。目前Meta所开源的这个Buck2版本,几乎和内部使用的版本相同,仅有换掉编译器工具链和远程执行服务器,并且换上开源替代项目。