在 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
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 = "..."
)
依赖项 A 和 B 都依赖于不同版本的 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"}
)
您还可以使用此机制来联接钻石。例如,如果 A 和 B
具有相同的依赖项,但使用不同的名称调用该依赖项,请在 myproject/WORKSPACE 中联接这些依赖项
。
从命令行替换代码库
如需从命令行使用本地代码库替换已声明的代码库,
请使用
--override_repository
标志。使用此标志会更改外部代码库的内容,而不会更改源代码。
例如,如需将 @foo 替换为本地目录 /path/to/local/foo,
请传递 --override_repository=foo=/path/to/local/foo 标志。
用例包括:
- 调试问题。例如,将
http_archive代码库替换为本地目录,以便您更轻松地进行更改。 - 供应商。如果您处于无法进行网络调用的环境中,请替换基于网络的代码库规则,以指向本地目录。
使用代理
Bazel 会从 HTTPS_PROXY 和 HTTP_PROXY
环境变量中提取代理地址,并使用这些地址下载 HTTP 和 HTTPS 文件(如果
已指定)。
对 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运行需要连接到互联网的 Java 构建目标(例如用于集成测试)时,请使用
--jvmopt=-Djava.net.preferIPv6Addresses=true工具 标志。例如,在.bazelrc文件中添加:build --jvmopt=-Djava.net.preferIPv6Addresses如果您使用
rules_jvm_external进行依赖项版本解析,请将-Djava.net.preferIPv6Addresses=true添加到COURSIER_OPTS环境变量 ,以便为 Coursier 提供 JVM 选项。
离线构建
有时,您可能希望离线运行构建,例如在飞机上旅行时。对于此类简单用例,请使用 bazel fetch 或 bazel sync 预提取所需代码库。如需在构建期间禁止提取更多代码库,请使用 --nofetch 选项。
对于真正的离线构建(其中不同的实体提供所有所需文件),Bazel 支持 --distdir 选项。此标志会告知 Bazel,当代码库规则要求 Bazel 提取文件时,首先查看该选项指定的目录,提取文件时使用ctx.download 或
ctx.download_and_extract。通过提供所需文件的哈希值,Bazel 会查找与第一个网址的基本名称匹配的文件,如果哈希值匹配,则使用本地副本。
Bazel 本身使用此技术从 分发
工件离线启动。它通过收集所有所需的外部
依赖项
在内部
distdir_tar来实现此目的。
Bazel 允许在代码库规则中执行任意命令,而无需知道它们是否调用网络,因此无法强制执行完全离线构建。如需测试构建是否在离线状态下正常运行,请手动阻止网络(如 Bazel 在其 启动 测试中所做的那样)。