В Базеле есть концепция создания генрулов на основе входного файла?
Представьте себе рабочий процесс сборки на основе Bazel, который позволяет брать содержимое файла (скажем, ) и создавать файлы для каждой строки . Теперь вы также знаете, что каждая строка и ее выходные данные независимы от всех остальных, т.е. каждая строка также может определять независимое правило сборки. Поэтому, если в большом изменяются только несколько строк, лучше создать выходные данные только для тех строк, которые изменились, чтобы избежать ненужных затрат на сборку.
С Базелем и
Но возможно ли, чтобы какая-то функция создавала эти правила «внутри» Bazel? (во избежание создания кода, который трудно понять и отладить, ИМХО)
Что-то вроде
new_rules = [
genrule(
name=uid,
srcs = [],
outs=[uid + ".out"],
cmd = "expensive-computation {} -o {}.out".format(uid, uid),
) for uid in open("sources-list.txt").readlines()
]
Предыстория: на самом деле я обрабатываю
2 ответа
файлы могут загружаться.bzl
файлы сload
функции и список каталогов (рекурсивно) с помощьюglob
. Любой другой ввод-вывод запрещен. Таким образом, фрагмент, подобный приведенному в первом сообщении, исключен.
Чтобы обойти эту проблему, можно использовать правила рабочей области, создав файл. Например, правила пипсаrules_python
, читатьrequirements.txt
файлы и генерироватьBUILD
файлы.
Ты пробовал это? Если некоторые из ваших результатов на 100% идентичны, я считаю, что Bazel избежит повторного выполнения последующих действий, которые используют только те файлы, которые были повторно созданы с идентичным содержимым. Я уже встречал эту концепцию в исходном коде, она называется «обрезка изменений».
Обратите внимание, что действия, использующие эти файлы, должны гарантировать, что только необходимые файлы будут объявлены в качестве входных данных. Если вы используете весьctx.files.attr_with_the_genrule
в качестве входных данных для действия в нижестоящем правиле, то это действие будет выполняться повторно при изменении любого из них. Хитрость заключается в том, чтобы использовать какое-то другое правило (возможно, собственное), чтобы извлекать только те файлы, которые вы хотите использовать в качестве входных данных для действий.