我有一个父目录foo
和一个子目录bar
,baz
和qux
。这四个目录均包含一个bazel构建文件,并定义了filegroup
规则,这些规则包含子目录中的所有文件(以及其他各种规则)。这样做的问题是,父目录filegroup
中的foo
无法使用全局变量来确保包括所有文件(因为全局变量不会跨越程序包边界)。相反,我目前正在srcs
中以foo
的形式手动列出所有子规则,并且此手动列表容易出错,因为当添加foo
的另一个子规则时,作者必须请记住将其添加到srcs
的{{1}}中。我尝试通过在foo
中添加genquery
规则来解决此问题,以取得一些进展(认为我可以在构建时以某种方式从此程序中提取src列表),但是不允许使用递归模式foo
规则中的expression
中,因此未成功。
创建这样的文件组最不容易出错的方法是什么?通过列出genquery
,有什么比我目前的手册更好的方法了?
答案 0 :(得分:2)
文件组的src
是list 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
进行的这两次大火查询的输出