Bazel:在多个http_archive BUILD文件之间共享宏



我的项目依赖于一些外部库,而这些库我必须自己解决。因此,我的WORKSPACE:

http_archive(
name = "external_lib_component1",
build_file = "//third_party:external_lib_component1.BUILD",
sha256 = "xxx",
urls = ["https://example.org/external_lib_component1.tar.gz"],
)
http_archive(
name = "external_lib_component2",
build_file = "//third_party:external_lib_component2.BUILD",
sha256 = "yyy",
urls = ["https://example.org/external_lib_component2.tar.gz"],
)
...

上面的两个条目是相似的,external_lib_component{1, 2}.BUILD共享了很多代码。在它们之间共享代码(宏(的最佳方式是什么?

仅仅将shared_macros.bzl文件放入third_party/是行不通的,因为它不会被复制到生成时的存档位置(仅复制build_file(。

如前所述,如果将bzl文件(如In your./third_party/shared_macros.bzl(放入树中。

然后,在为外部依赖项提供的//third_party:external_lib_component1.BUILD//third_party:external_lib_component2.BUILD中,可以使用从该共享文件加载符号

load("@//third_party:shared_macros.bzl", ...)

@//开头的标签指的是主存储库中的包,即使在外部依赖项中使用时也是如此(因为以//开头时,这些包会被根化。您可以查看标签上的文档,尤其是最后一段。


或者,您也可以通过名称来指代"父"项目。如果您的WORKSPACE文件中有:

workspace(name = "parent")

你可以说:

load("@parent//third_party:shared_macros.bzl", ...)

注意:在2.0.0之前的版本中,如果您在项目中混合了以上两种方法,则可能需要添加--incompatible_remap_main_repo

相关内容

最新更新