Объединить файловые группы в подпакетах в большую файловую группу в Bazel? - PullRequest
0 голосов
/ 27 октября 2018

У меня есть родительский каталог foo и дочерние каталоги bar, baz и qux. Все четыре каталога содержат базовый файл BUILD и определяют правила filegroup, которые содержат все файлы в подкаталоге (а также различные другие правила). Проблема заключается в том, что filegroup в родительском каталоге foo не может использовать глобус, чтобы гарантировать, что все файлы включены (потому что глобусы не пересекают границы пакета). Вместо этого я в настоящее время вручную перечисляю все дочерние правила как srcs в foo, и этот ручной список подвержен ошибкам, поскольку при добавлении другого дочернего элемента foo автор должен не забыть добавить его в srcs из foo. Я попытался добиться некоторого прогресса в решении этой проблемы, взглянув на добавление правила genquery в foo (полагая, что я могу каким-то образом извлечь список srcs из этого программного кода во время сборки), но рекурсивные шаблоны не разрешены в expression правила genquery, так что это не удалось.

Каков наименее подверженный ошибкам способ создания такой файловой группы? Есть ли что-нибудь лучше, чем моя текущая ручная конструкция, перечислив srcs?

1 Ответ

0 голосов
/ 28 октября 2018

src файловой группы представляет собой список меток .

Следовательно, вы можете (и должны) сделать

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

...