将子包中的文件组聚合到 bazel 中的大文件组中?

jon*_*rry 7 bazel

我有一个父目录foo和子目录barbazqux。所有四个目录都包含一个 bazel BUILD 文件并定义filegroup包含子目录中所有文件的规则(以及各种其他规则)。这样做的问题是filegroup父目录foo中的 不能使用 glob 来确保包含所有文件(因为 glob 不跨越包边界)。相反,我目前手工列出所有的孩子们的规则srcsfoo,本文档列表容易出错,因为当一个孩子foo被添加,作者一定要记得将它添加到srcsfoo。我试图通过添加一个genquery规则来foo(想从这个程序在编译的时候我能以某种方式提取SRCS的列表),但递归模式不在允许expression一个的genquery规则,所以这是不成功的。

创建这样一个文件组最不容易出错的方法是什么?有什么比我目前通过列表手动构建它更好的srcs吗?

rds*_*rds 8

src文件组是一个标签列表

因此,你可以(并且应该)做

filegroup(
  name = "foo_supergroup",
  srcs = [
     "//foo/bar:smallergroup",
     "//foo/baz:smallergroup",
     "//foo/qux:smallergroup",
  ],
)
Run Code Online (Sandbox Code Playgroud)

编辑:然后您可以添加预提交检查,以确保这些依赖项与子组相同。

为此,我建议你引入一个标签“是的”: foo/BUILD包含

filegroup(
  name = "smallergroup",
  srcs = glob(["*.txt"]),
  tags = ["yeah"],
)
Run Code Online (Sandbox Code Playgroud)

多亏了这一点:

blaze query 'attr("tags", ".*yeah.*", deps(//foo/...))'
//foo/bar:smallergroup
//foo/baz:smallergroup
//foo/qux:smallergroup
Run Code Online (Sandbox Code Playgroud)

然后很容易与超群的来源进行比较:

blaze query 'deps(//foo:foo_supergroup, 1)'
//foo:foo_supergroup
//foo/bar:smallergroup
//foo/baz:smallergroup
//foo/qux:smallergroup
Run Code Online (Sandbox Code Playgroud)

事实上,您不需要特定的预提交。您可以使用sh_test(使用命令diff)来比较这两个火焰查询的输出gen_query