如何在不同的子项目中使用相同的文件组定义

sha*_*unc 2 bazel

我需要为一些子项目声明特定资源,我正在按照以下方式进行

filegroup(
    name = "some_resources",
    visibility = ["//:app"],
    srcs = glob([
        "src/my/resources/**/*.resources",
    ]),
)
Run Code Online (Sandbox Code Playgroud)

然而,在任何子项目中,找到资源的路径都是相同的。我的问题是 - 在这种特殊情况下,最小化代码重复的最 bazelian(bazelish?)方法是什么?

基本上我想在相关的子项目中有类似 Expose_some_resources() 的东西。

然后使每个应用程序都可以看到这些资源。

ahu*_*sky 5

您可以将文件组放入文件中的宏中.bzl,然后在相关子项目中加载和运行该宏。

所以像:

workspace/resources.bzl

def expose_some_resources():
  native.filegroup(
    name = "some_resources",
    visibility = ["//:app"],
    srcs = native.glob([
        "src/my/resources/**/*.resources",
    ]),
  )
Run Code Online (Sandbox Code Playgroud)

workspace/subproject/BUILD

load("//:resources.bzl", "expose_some_resources")
expose_some_resources()
Run Code Online (Sandbox Code Playgroud)

您还可以考虑向宏添加一些错误检查,例如使用native.existing_rule检查每个包是否只调用一次宏,或检查 glob 是否返回 1 个或多个文件。