供应商模式

供应商模式是 Bzlmod 的一项功能,可让您创建外部依赖项的本地副本。这对于离线构建或想要控制外部依赖项的来源时非常有用。

启用供应商模式

您可以通过指定 --vendor_dir 标志来启用供应商模式。

例如,通过将其添加到 .bazelrc 文件中:

# Enable vendor mode with vendor directory under <workspace>/vendor_src
common --vendor_dir=vendor_src

供应商目录可以是工作区根目录的相对路径,也可以是绝对路径。

提供特定外部代码库

您可以使用带有 --repo 标志的 vendor 命令指定要提供给供应商的代码库,该命令同时接受规范代码库名称明显代码库名称

例如,运行以下命令:

bazel vendor --vendor_dir=vendor_src --repo=@rules_cc

bazel vendor --vendor_dir=vendor_src --repo=@@rules_cc~

都会获得 rules_cc,以供在 <workspace root>/vendor_src/rules_cc~ 下提供。

给定目标的供应商外部依赖项

如需供应商构建给定目标模式所需的所有外部依赖项,您可以运行 bazel vendor <target patterns>

例如:

bazel vendor --vendor_dir=vendor_src //src/main:hello-world //src/test/...

将使用当前配置提供构建 //src/main:hello-world 目标以及 //src/test/... 下所有目标所需的所有代码库。

在后台,它会执行 bazel build --nobuild 命令来分析目标模式,因此构建标志可能会应用于此命令并影响结果。

离线构建目标

提供外部依赖项后,您可以通过以下命令离线构建目标:

bazel build --vendor_dir=vendor_src //src/main:hello-world //src/test/...

构建应在没有网络访问权限和代码库缓存的干净构建环境中运行。

因此,您应该能够签入供应商的源代码,并在另一台机器上离线构建相同的目标。

提供所有外部依赖项

如需在您的传递外部依赖项图中提供所有代码库,您可以运行以下命令:

bazel vendor --vendor_dir=vendor_src

请注意,提供所有依赖项都存在一些缺点

  • 提取所有代码库(包括以传递方式引入的代码库)可能非常耗时。
  • vendor 目录可能会变得非常大。
  • 如果某些代码库与当前平台或环境不兼容,则可能无法提取。

因此,应先考虑通过 vendor 方法指定特定目标。

使用 VENDOR.bazel 配置供应商模式

您可以通过位于 vendor 目录下的 VENDOR.bazel 文件,控制如何处理给定代码库。

有两种指令,均接受规范代码库名称列表作为参数:

  • ignore():表示完全忽略供应商模式下的代码库。
  • pin():将代码库固定到其当前供应商的源代码,就好像此代码库具有 --override_repository 标志一样。除非取消固定,否则 Bazel 在运行供应商命令时不会更新此代码库的供应商源代码。用户可以手动修改和维护此代码库的供应商源代码。

例如:

ignore("@@rules_cc~")
pin("@@bazel_skylib~")

采用此配置

  • 这两个代码库将从后续供应商命令中排除。
  • Repo bazel_skylib 将被替换为位于 vendor 目录下的源代码。
  • 用户可以安全地修改通过供应商提供的 bazel_skylib 源代码。
  • 如需重新添加 bazel_skylib 代码,用户必须先停用 PIN 码。

了解供应商模式的工作原理

Bazel 提取 $(bazel info output_base)/external 下的项目的外部依赖项。通过 vendor 方法提供外部依赖项,意味着将相关文件和目录移至给定供应商目录,并将 vendor 提供的源代码用于后续 build。

通过供应商提供的内容包括:

  • 代码库目录
  • 代码库标记文件

在构建期间,如果供应商提供的标记文件是最新的,或者代码库固定在 VENDOR.bazel 文件中,则 Bazel 会在 $(bazel info output_base)/external 下创建一个指向该供应商的源的符号链接,而不是实际运行代码库规则。否则,系统会显示一条警告,并且 Bazel 将回退为获取最新版本的代码库。