Bazel 项目布局和组织

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 扩展文件,请参阅此页面。


  1. 出于旧版原因,此文件也可以简称为 WORKSPACE ↩

  2. 出于历史原因,该文件也可以简称为 BUILD。↩