有关外部依赖项的高级主题

报告问题 查看源代码

覆盖 WORKSPACE 中的依赖项

请尽可能在项目中提供一个版本政策,这是您编译所针对并最终包含在最终二进制文件中的依赖项。对于其他情况,您可以影子依赖项:

myproject/WORKSPACE

workspace(name = "myproject")

local_repository(
    name = "A",
    path = "../A",
)
local_repository(
    name = "B",
    path = "../B",
)

A/WORKSPACE

workspace(name = "A")

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
    name = "testrunner",
    urls = ["https://github.com/testrunner/v1.zip"],
    sha256 = "...",
)

B/工作区

workspace(name = "B")

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
    name = "testrunner",
    urls = ["https://github.com/testrunner/v2.zip"],
    sha256 = "..."
)

依赖项 AB 都依赖于不同版本的 testrunner。通过在 myproject/WORKSPACE 中为二者分别指定不同的名称,将二者包含在 myproject 中且不存在冲突:

workspace(name = "myproject")

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
    name = "testrunner-v1",
    urls = ["https://github.com/testrunner/v1.zip"],
    sha256 = "..."
)
http_archive(
    name = "testrunner-v2",
    urls = ["https://github.com/testrunner/v2.zip"],
    sha256 = "..."
)
local_repository(
    name = "A",
    path = "../A",
    repo_mapping = {"@testrunner" : "@testrunner-v1"}
)
local_repository(
    name = "B",
    path = "../B",
    repo_mapping = {"@testrunner" : "@testrunner-v2"}
)

您也可以使用此机制来联接菱形。例如,如果 AB 具有相同的依赖项,但以不同的名称对其进行调用,请在 myproject/WORKSPACE 中联接这些依赖项。

从命令行替换代码库

如需从命令行将声明的代码库替换为本地代码库,请使用 --override_repository 标志。使用此标志会更改外部代码库的内容,而无需更改源代码。

例如,如需将 @foo 替换成本地目录 /path/to/local/foo,请传递 --override_repository=foo=/path/to/local/foo 标志。

用例包括:

  • 调试问题。例如,将 http_archive 代码库替换为本地目录,以便您更轻松地进行更改。
  • 供应商开发。如果您处于无法进行网络调用的环境中,请将基于网络的代码库规则替换为指向本地目录。

使用代理

Bazel 会从 HTTPS_PROXYHTTP_PROXY 环境变量中选择代理地址,并使用它们下载 HTTPHTTPS 文件(如果已指定)。

支持 IPv6

在仅支持 IPv6 的机器上,Bazel 可以原封不动地下载依赖项。但是,在双栈 IPv4/IPv6 机器上,Bazel 遵循与 Java 相同的惯例,如果启用,则首选 IPv4。在某些情况下,例如当 IPv4 网络无法解析/访问外部地址时,可能会导致 Network unreachable 异常和构建失败。在这些情况下,您可以使用 java.net.preferIPv6Addresses=true 系统属性替换 Bazel 的行为以首选 IPv6。具体而言:

  • 使用 --host_jvm_args=-Djava.net.preferIPv6Addresses=true 启动选项,例如在 .bazelrc 文件中添加以下代码行:

    startup --host_jvm_args=-Djava.net.preferIPv6Addresses=true

  • 在运行需要连接到互联网的 Java build 目标(例如进行集成测试)时,请使用 --jvmopt=-Djava.net.preferIPv6Addresses=true 工具标志。例如,在您的 .bazelrc 文件中添加以下代码:

    build --jvmopt=-Djava.net.preferIPv6Addresses

  • 如果您使用 rules_jvm_external 进行依赖项版本解析,还需要将 -Djava.net.preferIPv6Addresses=true 添加到 COURSIER_OPTS 环境变量中,以便为 Coursier 提供 JVM 选项

离线构建

有时,您可能希望离线运行 build,例如在飞机旅行时。对于这种简单的用例,请使用 bazel fetchbazel sync 预提取所需的代码库。如需在构建期间停用提取更多代码库,请使用 --nofetch 选项。

对于真正的离线构建(即另一个实体提供所有需要的文件),Bazel 支持选项 --distdir。当代码库规则要求 Bazel 提取包含 ctx.downloadctx.download_and_extract 的文件时,此标志会告知 Bazel,首先查找该选项指定的目录。通过提供所需文件的哈希总和,Bazel 会查找与第一个网址的基名匹配的文件,并在哈希匹配时使用本地副本。

Bazel 本身使用此技术从分发工件进行离线引导。为此,它会在内部 distdir_tar收集所有需要的外部依赖项

Bazel 允许执行代码库规则中的任意命令,而无需知道这些命令是否向网络发出调用,因此无法强制执行完全离线的构建。如需测试构建能否在离线状态下正常运行,请手动屏蔽网络(就像 Bazel 在其引导测试中所执行的操作一样)。