Bazel 项目
Bazel 项目是一组源文件和 build 文件,用于描述:
- 如何构建工件(例如二进制文件或数据文件)及其依赖项。
- 如何运行特定命令,即脚本或可执行文件。
- 如何测试上述 build 工件。
Bazel 项目由顶级目录实现,其内容遵循特定布局和惯例。
Bazel 工作区
Bazel 工作区是一个包含顶级 WORKSPACE.bazel1 文件的目录树。此属性定义了一组源代码和相关 build 文件的根目录。一个 Bazel 项目可以使用多个工作区:
项目的根目录称为根工作区,因此必须包含
WORKSPACE.bazel文件。项目还可以引用其他工作区(称为外部 代码库),这些工作区对应于第三方项目依赖项。
例如,在以下情况下:
/home/user/project/
WORKSPACE.bazel
src/
BUILD.bazel
extra/
extra.cc
lib/
BUILD.bazel
foo.cc
foo.h
main.cc
目录 /home/user/project 是一个根 Bazel 工作区,其中包含所有文件。
WORKSPACE.bazel 文件可以为空,但也可以包含引用其他工作区的指令,如后文所述。
Bazel 软件包
在工作区内,包含 BUILD.bazel2 文件的目录定义了一个软件包,该软件包是 Bazel 知道的一组源文件和项的边界。
例如,以下文件布局:
/home/user/project/
WORKSPACE.bazel
BUILD.bazel
main.cc
定义一个位于 /home/user/project 的根工作区,其中包含一个顶级软件包,该软件包包含文件 BUILD.bazel 和 main.cc。
BUILD.bazel 文件还可以包含用于定义命名项(例如目标、配置条件等)的指令,这些项在技术上也属于软件包。
一个工作区中可以存在多个软件包,但每个文件只能属于一个软件包。例如,假设文件布局如下:
/home/user/project/
WORKSPACE.bazel
BUILD.bazel
main.cc
lib/
BUILD.bazel
foo.cc
根工作区包含两个不同的软件包:
顶级软件包,仍包含文件
BUILD.bazel和main.cc(相对于根工作区目录)。第二个软件包,其中包含文件
lib/BUILD.bazel和lib/foo.cc。
请注意,/home/user/project/lib/foo.cc 中的文件仅属于第二个软件包,而不属于第一个软件包。这是因为软件包 边界 永远不会 重叠。
BUILD.bazel对阵BUILD
Bazel 源自 Google 的 Blaze,后者仅适用于 Linux(区分大小写的文件系统)。Blaze 仅使用文件名 BUILD 来存储 build 指令。
不过,Bazel 也需要在具有不区分大小写的文件系统的 Windows 上运行,而许多 Google 或非 Google 项目已经使用名为“build”的目录,这会导致该目录与此类系统上名为“BUILD”的文件发生冲突。
为了解决此问题,Bazel 使用 BUILD.bazel 和 WORKSPACE.bazel 作为默认文件名,同时仍支持 BUILD 和 WORKSPACE 作为后备文件名。
Workspace 指令
根 WORKSPACE.bazel 可以为空,也可以包含引用其他 Bazel 工作区的指令,这些工作区称为外部代码库。这些指令始终会为代码库命名。例如:
local_repository(
name = "my_ssl",
path = "/home/user/src/openssl-bazel",
)
将名称 my_ssl 与 build 机器上位于 /home/user/src/openssl-bazel 的工作区相关联。此目录还必须包含 WORKSPACE.bazel(或 WORKSPACE)文件。
代码库只是一个具有名称的外部 Bazel 工作区。此名称是您项目的本地名称,稍后可用于引用外部工作区中的项目(请参阅下文)。
Bazel 还支持其他指令,用于从网络下载代码库,甚至以编程方式生成其内容。
Bazel 标签
如需了解 Bazel 标签的简介,请参阅此页面。
Bazel 扩展文件 (.bzl)
如需了解 Bazel 扩展文件,请参阅此页面。