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

时间:2018-10-27 01:21:22

标签: bazel

我有一个父目录foo和一个子目录barbazqux。这四个目录均包含一个bazel构建文件,并定义了filegroup规则,这些规则包含子目录中的所有文件(以及其他各种规则)。这样做的问题是,父目录filegroup中的foo无法使用全局变量来确保包括所有文件(因为全局变量不会跨越程序包边界)。相反,我目前正在srcs中以foo的形式手动列出所有子规则,并且此手动列表容易出错,因为当添加foo的另一个子规则时,作者必须请记住将其添加到srcs的{​​{1}}中。我尝试通过在foo中添加genquery规则来解决此问题,以取得一些进展(认为我可以在构建时以某种方式从此程序中提取src列表),但是不允许使用递归模式foo规则中的expression中,因此未成功。

创建这样的文件组最不容易出错的方法是什么?通过列出genquery,有什么比我目前的手册更好的方法了?

1 个答案:

答案 0 :(得分:2)

文件组的srclist of labels

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

filegroup(
  name = "foo_supergroup",
  srcs = [
     "//foo/bar:smallergroup",
     "//foo/baz:smallergroup",
     "//foo/qux:smallergroup",
  ],
)

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

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

filegroup(
  name = "smallergroup",
  srcs = glob(["*.txt"]),
  tags = ["yeah"],
)

感谢:

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

然后可以轻松地与超组的来源进行比较:

blaze query 'deps(//foo:foo_supergroup, 1)'
//foo:foo_supergroup
//foo/bar:smallergroup
//foo/baz:smallergroup
//foo/qux:smallergroup

实际上,您不需要特定的预先提交。您可以使用sh_test(使用命令diff)来比较用gen_query进行的这两次大火查询的输出