覆盖 WORKSPACE 中的依赖项
您应尽可能在项目中使用单个版本政策,这是编译时所依据的、最终以最终二进制文件显示的依赖项所必需的。对于其他情况,您可以影子依赖项:
myproject/工作区
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 = "..."
)
依赖项 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
代码库替换到一个可在其中更轻松地进行更改的本地目录。 - Selling。如果处于无法进行网络调用的环境中,请将基于网络的代码库规则替换为指向本地目录。
使用代理
Bazel 会从 HTTPS_PROXY
和 HTTP_PROXY
环境变量中获取代理地址,并使用这些地址下载 HTTP
和 HTTPS
文件(如果已指定)。
支持 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 构建目标(例如集成测试)时,请使用
--jvmopt=-Djava.net.preferIPv6Addresses=true
工具标志。例如,在.bazelrc
文件中包含以下内容:build --jvmopt=-Djava.net.preferIPv6Addresses
如果您使用
rules_jvm_external
解析依赖项版本,还应将-Djava.net.preferIPv6Addresses=true
添加到COURSIER_OPTS
环境变量中,以为 Coursier 提供 JVM 选项。
离线 build
有时,您可能希望离线运行构建,例如在飞机旅行时。对于此类简单的用例,请使用 bazel fetch
或 bazel sync
预提取所需的代码库。如需在构建期间停用提取更多代码库的功能,请使用 --nofetch
选项。
对于真正的离线构建(另一个实体提供所有需要的文件),Bazel 支持 --distdir
选项。当代码库规则要求 Bazel 使用 ctx.download
或 ctx.download_and_extract
提取文件时,此标志会告知 Bazel 先查看该选项指定的目录。通过提供所需文件的哈希总和,Bazel 会查找与第一个网址的基名匹配的文件,并在哈希值匹配时使用本地副本。
Bazel 本身使用此技术从分发工件离线引导。为此,它会在内部 distdir_tar
中收集所需的所有外部依赖项。
Bazel 允许执行代码库规则中的任意命令,而无需知道这些命令是否向网络调用,因此无法强制执行完全离线构建。如需测试构建能否在离线状态下正常运行,请手动屏蔽网络(正如 Bazel 在其引导测试中所做的那样)。