Могу ли я получить Bazel для запуска дополнительных действий после создания цели? - PullRequest
0 голосов
/ 10 октября 2019

У меня есть правило Базеля, которое производит артефакт. Как мне сделать, чтобы добавить шаг постобработки с артефактом, созданным как зависимость?

У нас есть большая система сборки, где наши макросы используются в нескольких файлах BUILD. Поэтому теперь мне нужно добавить еще один шаг, который бы использовал артефакты, созданные конкретным макросом, для создания другого артефакта, и, надеюсь, без необходимости обновлять все файлы BUILD.

В не базельском контексте я, вероятно, использовал бы что-тоэто вызывает дополнительный шаг, но в контексте bazel лучшее, что я придумал, это добавление нового макроса, который использует правило, созданное другим макросом, в качестве зависимости.

Это что-товот так сегодняМакрос M1 генерирует правило R1 - которое создает артефакт A. В сборочном файле B используется макрос M1, и когда эта цель создается, создается артефакт A.

Так что теперь я могу добавить макрос M2, который генерирует правило R2, который создает артефакт B. Артефакт А является зависимостью от этого правила. Вместо этого пользователи будут использовать макрос M2.

Но могу ли я сделать это другим способом?

Примером использования может быть то, что у меня есть макрос, который создает двоичный файл, и теперь я хочу добавить, например, подпись. «Пользователи» по-прежнему захотят создать этот двоичный файл, и подписанный артефакт будет создан как побочный продукт, мало интересующий пользователей.

1 Ответ

0 голосов
/ 18 октября 2019

Вы можете обновить M1 для вызова M2.

M1, вызывающий M2, просто объявляет правила. Обычно макросы выглядят так:

def M1(name, arg1, ...):
    R1(name=name, arg1=arg1, ...)

Когда вы создаете правило M1 "// foo: bar", вы фактически строите R1 с именем "// foo: bar". Поэтому вы должны обновить M1 для вызова R1, используя другое имя, отличное от name, например, name + "dep", и вызвать M2 с name и передать R1 name в качестве зависимости. Итак, если вы создадите "// foo: bar", вы создадите основное правило M2 (R2), которое зависит от R1, и поэтому Bazel сначала строит R1 (и производит A), а затем R2 (потребляет A) ..

Еще одна вещь: Bazel предварительно обрабатывает макросы в реальных правилах перед тем, как загружать правила в файл BUILD. Вы можете проверить результат этой предварительной обработки, чтобы увидеть, какие правила у вас действительно есть в пакете, например:

bazel query --output=build //foo:*
...