如何从本地文件模拟http_archive



我有实现bazel规则的主项目和模拟最终用户体验的子项目。在子项目中,我想加载在主项目中创建的归档文件,就好像它是使用http_archive加载的一样。以下是回购设置示例:

root/
|- WORKSPACE
|- BUILD
|- rules.bzl
- integration-tests/
|- WORKSPACE
|- BUILD

root/BUILD文件具有创建tar.gz文件的:release目标。我想在integration-tests/WORKSPACE中加载这个文件,就好像它是使用http_archive加载的一样。有办法做到这一点吗?


我发现的最简单的方法是使用:

http_archive(
urls = [
"file://path_to_archive",
],
)

有办法做到这一点吗?

严格来说,没有办法做到这一点。像http_archive这样的存储库规则在构建的加载阶段执行,而构建输出则在执行阶段创建。存储库规则不能依赖于生成目标,因为该目标尚未生成。

即使是跨工作区边界的情况也是如此。子项目的WORKSPACE不可能直接依赖于父项目或任何其他项目的生成目标。

在这种情况下,我会考虑是否真的需要在WORKSPACE中加载发布tarball。这个柏油球真的是巴泽尔的仓库吗?如果是这样的话,您可能需要研究测试Bazel扩展的技术。

您可以在命令行上覆盖依赖项,并使用存储库的本地签出而不是http_archive

例如,给定以下WORKSPACE.bazel

workspace(name = "cli_cpp")
# Group the sources of the library so that CMake rule have access to it
all_content = """filegroup(name = "all", srcs = glob(["**"]), visibility = ["//visibility:public"])"""
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
name = "qpid-cpp",
build_file_content = all_content,
strip_prefix = "qpid-cpp-main",
url = "https://github.com/apache/qpid-cpp/archive/main.zip",
)

您可以签出qpid-cpp存储库,或者下载并解压缩该档案,在其中进行更改,添加一个空的WORKSPACE.bazel文件,还可以在中添加以下BUILD.bazel

filegroup(name = "all", srcs = glob(["**/*"]), visibility = ["//visibility:public"])

现在,用运行Bazel

--override_repository=qpid-cpp=/path/to/qpid-cpp

最新更新