跳转至

Bazel

Bazel 是谷歌开源的构建系统,其内部名称叫做 Blaze,适合在单一代码库下使用,可以很方便的跨项目使用依赖,同时也内置了多种编译脚本,用户不需要手写编译命令,同时还可以从指定的 Git 仓库或者 URL 下载依赖文件等。Bazel 构建时会使用沙箱环境,保证每次构建的产物都是完全一致的。

Bazel 的优缺点都很明显,优点是构建命令编写简单,采用了类似 Python 的 Starlark 语言作为 DSL,而且支持细粒度的编译产物管理,使得项目互相引用变得十分简单,提高了编译缓存的效率。同时,其采用的客户端服务端模式,可以很方便的扩展到多台服务器上,进行多机的分布式编译。沙箱式构建保证了函数式的构建过程,只要输入给定了,那么输出一定是完全一致的,这样就不会有由于环境不一样导致构建产物不一样的现象。同时,沙箱式构建也要求开发者显式地声明所有的依赖,这样一个模块改动时,可以很方便地通过自动化工具分析出受影响的下游模块。

但是,也正因为其自带了依赖管理,Bazel 自成一套体系,无法利用好现成的 CMake 项目等,如果通过添加规则来调用 CMake 构建项目,就失去了 Bazel 细粒度依赖管理的优势。同时,对于自带依赖管理的语言,例如 NodeJS、Go、Rust 等,就需要维护两套依赖声明文件。也就是说,Bazel 的缺点就是对于非 Bazel 项目极其不友好,需要用户自己编写 Bazel 构建文件,对于复杂的项目,迁移到 Bazel 将会是非常麻烦和困难的工作。另外,在个人使用的时候,Bazel 则显得非常耗费资源。首先是它需要在本地使用 Java 启动一个构建服务器,在构建完成之后也不会退出,常驻占用资源,对于跨平台的支持还有些问题。最后则是 IDE 和编辑器支持还比较有限,因为依赖和构建产物都放在了 Bazel 自己的目录里,对 C++ 项目启用智能提示会比较麻烦。

对比优缺点,Bazel 可能更适合团队在比较大型的单一代码库合作使用,并使用专门的编译服务器来进行编译,共享编译缓存,并且有可能需要自己编写工具解决一些问题。


最后更新: 2021-07-28 21:44:41
本页作者: Howard Lau