Bazel 7 发布:全新模块化依赖管理、无字节构建与多目标构建性能提升

2024-01-04 14:20:12 浏览数 (3)

作者 | Sergio De Simone

译者 | Sambodhi

策划 | 丁晓昀

最近在 BazelCon 23 上宣布,Bazel 7 推出了多年来一直在开发中的一系列新功能,其中包括全新的模块化外部依赖管理系统 Bzlmod、全新优化的“Build without the Bytes”模式、得益于 Project Skymeld 的多目标构建性能改进等等。

Bzlmod 作为一个全新的模块化外部依赖管理系统,取代了旧的 WORKSPACE 机制。一个 Bazel 模块是一个项目,可以有多个版本,每个版本依赖于一组特定的依赖关系,如下所示:

代码语言:javascript复制
module(name = "my-module", version = "1.0")

bazel_dep(name = "rules_cc", version = "0.0.1")
bazel_dep(name = "protobuf", version = "3.19.0")

Bzlmod,这个新的外部依赖子系统,不直接使用 repo 定义。相反,它从模块构建依赖图,运行在图的顶部的扩展,并相应地定义 repos。Bzlmod 现在默认启用,这意味着如果一个项目没有 MODULE.bazel 文件,Bazel 将创建一个空文件。虽然 Bazel 7 仍然与之前的系统兼容,但开发者应在 Bazel 8 发布之前进行 迁移 到 Bzlmod。

无字节构建(Build without the Bytes,BwoB)通过只下载中间文件的子集,有效减少了 Bazel 在远程构建中传输的数据量。

在过去,Bazel 的默认行为是在远程执行操作后,或者在命中远程缓存后下载操作的每个输出文件。然而,在大型构建中,所有输出文件的总和通常会达到数十甚至数百吉字节。远程执行和缓存的好处可能会被这种下载的成本所抵消,尤其是在网络连接较差的情况下。虽然 BwoB 已经存在很长时间,但现在它已经稳定,并且在边缘情况下变得可靠,因此可以作为新的默认选项使用。

Skymeld 是另一个旨在提高生产力的功能,特别是对于具有多个顶级目标的构建。它引入了一种评估模式,消除了分析和执行阶段之间的障碍,并且允许目标在其分析完成后独立执行,以提高构建速度。

最后提到,Bazel 7 现在默认启用了基于平台的工具链解析,适用于其 Android 和 C 规则。这一变化旨在简化所有规则集中的工具链解析 API,从而省去语言特定标志,如 --android_cpu--crosstool_top

Android 项目需要停止使用传统标志 --fat_apk_cpu,而改用使用以 @platforms//os:android 约束定义的平台的 --android_platforms。关于 Bazel 7 的其他功能,由于篇幅限制无法一一详述,请务必查看 官方发布说明 获取完整的细节。

作者简介:

Sergio De Simone 是一位资深软件工程师。在过去的 25 年中,他参与了多个不同的项目和公司,包括西门子、惠普等各种工作环境。过去的 10 多年里,他专注于移动平台及相关技术的开发。目前,他在 BigML,Inc. 工作,负责领导 iOS 和 macOS 的开发。

原文链接:

https://www.infoq.com/news/2023/12/bazel-7-released/

声明:本文为 InfoQ 翻译整理,未经许可禁止转载。

1 人点赞