Рекомендуемая стратегия для накопления данных в выходных файлах по аспектам базеля
Я пишу инструмент для пост-сборки, которому нужно найти список файлов jar цели. Для этих местоположений у меня есть аспект, который работает со списком целей (отдельно для каждой цели, используя --aspect) и извлекает путь к файлу jar для каждой из них.
Мне удалось получить путь к каждому файлу jar в пользовательском выходном файле (например, jar.txt) в выходной папке каждой цели.
Но это будет означать, что мне нужно будет просмотреть каждый файл jar.txt отдельно, чтобы получить местоположение.
Есть ли способ накапливать пути к файлам jar в одном файле?
Что-то вроде:
Попробуйте написать в ту же папку вывода с помощью команды добавления в аспекте. Я не уверен, возможна ли общая папка вывода.
Создайте синтетическую цель, которая зависит от всех релевантных целей, затем запустите аспект этой цели, накапливайте jar-файлы и записывайте их в корень только после возвращения рекурсии.
1. или 2. допустимые варианты?
Какова рекомендуемая стратегия для накапливания данных в выходных файлах на основе Bazel?
2 ответа
Базель не предоставляет возможности в Жаворонке для накопления информации между целями, которые не связаны друг с другом в графе целей (например, те, которые упомянуты в командной строке рядом друг с другом).
Одной из возможностей может быть написание правила Skylark, которое зависит от всех целей, которые вы обычно упоминаете в командной строке, и создало их; это правило сможет сопоставлять пути классов из каждой цели Java в один файл.
Другая возможность - указать Bazel записать события сборки (включая все выходные данные всех целей, в которые распространяется указанный шаблон сборки) в файл, используя --experimental_build_event_{json,text,binary}_file
, ("Эксперимент" будет удален в ближайшее время.). Файлы содержат экземпляры этого сообщения:
Натан,
Если я правильно понимаю, вы хотите транзитивно распространять информацию от каждого аспектного узла в единый результат. Для этого создайте транзитивный набор в реализации правила аспекта и передайте его через механизм "provider" [^1]. Я написал несколько примеров по аспектам Bazel, возможно, вы найдете это полезным [^ 2].