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

<ph type="x-smartling-placeholder"></ph> 报告问题 查看来源 敬上 每晚 · 7.3。 · 7.2 条 · 7.1敬上 · 7.0。 · 6.5

覆盖 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 中同时为二者提供不同的名称,以免发生冲突 myproject/WORKSPACE

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 异常和构建失败。在这些情况下,您可以覆盖 Bazel 的首选使用 IPv6 行为 java.net.preferIPv6Addresses=true 系统 属性。 具体而言:

  • 使用 --host_jvm_args=-Djava.net.preferIPv6Addresses=true 启动 选项,例如将 .bazelrc 文件中的下面这行代码:

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

  • 运行需要连接到互联网(例如 集成测试),请使用 --jvmopt=-Djava.net.preferIPv6Addresses=true 工具 标志。例如,在您的.bazelrc中包含 文件

    build --jvmopt=-Djava.net.preferIPv6Addresses

  • 如果您使用的是 rules_jvm_external 添加依赖项版本 将 -Djava.net.preferIPv6Addresses=true 迁移到 COURSIER_OPTS 环境 变量为提供 JVM 选项, Coursier

离线构建

有时您可能希望离线运行构建,例如在 飞机。对于这种简单的用例,使用以下代码预提取所需的代码库: bazel fetchbazel sync。如需停用在 Cloud Monitoring 中 请使用 --nofetch 选项。

对于真正的离线版本(即由其他实体提供所有需要的文件), Bazel 支持 --distdir 选项。此标志会告知 Bazel,首先进行以下检查: 当代码库规则要求 Bazel 执行时,该选项指定的目录 使用 ctx.downloadctx.download_and_extract。修改者 提供了所需文件的哈希总和,则 Bazel 会查找与 第一个网址的基名名称,并使用本地副本(如果哈希值匹配)。

Bazel 本身使用此技术从发行版 工件。 为此,它会收集所有必要的外部 依赖项 一个内部 IP 地址 distdir_tar

Bazel 允许在不知道 如果它们向网络发出调用请求,则无法强制执行完全离线的构建。接收者 在离线状态下测试 build 能否正常运行,手动中断网络(如 Bazel 在引导加载程序的引导中执行的操作 测试)。