Bazel 概览
Bazel是一个构建工具, 它可以协调构建各个模块, 并且可以运行单元测试. 它的扩展语言使它可以构建任何类型的计算机语言, 并且原生支持Java,C,C++和Python. Bazel的作者已经在各个平台上进行了充分的构建和测试.
用简单的声明性语言构建文件
Bazel的BUILD文件描述了怎样构建你的项目. 它的语法结构类似于Python的语法. 你可以编写BUILD文件的规则来构建你的系统. 或者通过扩展Bazel的规则使它能够在任何平台上构建任何语言.
下面是一个Hello World程序的BUILD 构建文件, 它使用到了两个规则: cc_library 和 cc_binary.
cc_library(
name = "hello-time",
srcs = ["hello-time.cc"],
hdrs = ["hello-time.h"],
)
cc_binary(
name = "hello-world",
srcs = ["hello-world.cc"],
deps = [
":hello-time",
"//lib:hello-greet",
],
)
描述整个系统的系赖图
BUILD文件中声明了构建依赖的资源, Bazel可以通过它精确地画出所有源代码的依赖图. 只不过这张图由Bazel维护在内存中. 由于这张精确的依赖图存在, 它使得增量构建和平行执行成为了可能.
下面这张依赖图是通过上面的BUILD文件, 来描述 "hello-world"目标的依赖的关系
Bazel的查询语言可以让你生成这样的依赖图, 你也可以使用查询语言获得 构建依赖和依赖之间的关系.
快速地构建和测试, 修改和复现
互不干扰的规则和沙箱环境让Bazel构建出正确的, 可重复使用的构件和测试结果. 缓存可以使构建出的构件和和测试结果重复使用.
Bazel的构建速度特别快, 增量构建使得Bazel在进行重复构建时可以做最少的工作. Bazel的准确性和可重复性使得Bazel可以重复使用未经修改且已缓存的构件. 也就是说当你修改你的代码时, Bazel不会重新构建你所有的源代码, 而只是重新构建你修改了的代码.
你可以完全信任Bazel的构建结果的正确性. 也就是说你不用运行 bazel clean命令来清除bazel的构建结果. 如果你需要运行 bazel clean命令, 那只能说明 bazel 存在着bug.