Рекомендуемая стратегия для накопления данных в выходных файлах по аспектам базеля

Я пишу инструмент для пост-сборки, которому нужно найти список файлов jar цели. Для этих местоположений у меня есть аспект, который работает со списком целей (отдельно для каждой цели, используя --aspect) и извлекает путь к файлу jar для каждой из них.

Мне удалось получить путь к каждому файлу jar в пользовательском выходном файле (например, jar.txt) в выходной папке каждой цели.

Но это будет означать, что мне нужно будет просмотреть каждый файл jar.txt отдельно, чтобы получить местоположение.

Есть ли способ накапливать пути к файлам jar в одном файле?
Что-то вроде:

  1. Попробуйте написать в ту же папку вывода с помощью команды добавления в аспекте. Я не уверен, возможна ли общая папка вывода.

  2. Создайте синтетическую цель, которая зависит от всех релевантных целей, затем запустите аспект этой цели, накапливайте jar-файлы и записывайте их в корень только после возвращения рекурсии.

1. или 2. допустимые варианты?
Какова рекомендуемая стратегия для накапливания данных в выходных файлах на основе Bazel?

2 ответа

Решение

Базель не предоставляет возможности в Жаворонке для накопления информации между целями, которые не связаны друг с другом в графе целей (например, те, которые упомянуты в командной строке рядом друг с другом).

Одной из возможностей может быть написание правила Skylark, которое зависит от всех целей, которые вы обычно упоминаете в командной строке, и создало их; это правило сможет сопоставлять пути классов из каждой цели Java в один файл.

Другая возможность - указать Bazel записать события сборки (включая все выходные данные всех целей, в которые распространяется указанный шаблон сборки) в файл, используя --experimental_build_event_{json,text,binary}_file, ("Эксперимент" будет удален в ближайшее время.). Файлы содержат экземпляры этого сообщения:

https://github.com/bazelbuild/bazel/blob/master/src/main/java/com/google/devtools/build/lib/buildeventstream/proto/build_event_stream.proto

Натан,

Если я правильно понимаю, вы хотите транзитивно распространять информацию от каждого аспектного узла в единый результат. Для этого создайте транзитивный набор в реализации правила аспекта и передайте его через механизм "provider" [^1]. Я написал несколько примеров по аспектам Bazel, возможно, вы найдете это полезным [^ 2].

  1. https://github.com/pcj/bazel_aspects/blob/master/aspects.bzl#L94-L104

  2. https://github.com/pcj/bazel_aspects

Другие вопросы по тегам