В Базеле есть концепция создания генрулов на основе входного файла?

Представьте себе рабочий процесс сборки на основе Bazel, который позволяет брать содержимое файла (скажем, ) и создавать файлы для каждой строки . Теперь вы также знаете, что каждая строка и ее выходные данные независимы от всех остальных, т.е. каждая строка также может определять независимое правило сборки. Поэтому, если в большом изменяются только несколько строк, лучше создать выходные данные только для тех строк, которые изменились, чтобы избежать ненужных затрат на сборку.

С Базелем иединственным подходом для достижения этой цели была бы предварительная обработка(до) создаватьфайлы для каждой строки и запустите 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()
]

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

2 ответа

файлы могут загружаться.bzlфайлы сloadфункции и список каталогов (рекурсивно) с помощьюglob. Любой другой ввод-вывод запрещен. Таким образом, фрагмент, подобный приведенному в первом сообщении, исключен.

Чтобы обойти эту проблему, можно использовать правила рабочей области, создав файл. Например, правила пипсаrules_python, читатьrequirements.txtфайлы и генерироватьBUILDфайлы.

Ты пробовал это? Если некоторые из ваших результатов на 100% идентичны, я считаю, что Bazel избежит повторного выполнения последующих действий, которые используют только те файлы, которые были повторно созданы с идентичным содержимым. Я уже встречал эту концепцию в исходном коде, она называется «обрезка изменений».

Обратите внимание, что действия, использующие эти файлы, должны гарантировать, что только необходимые файлы будут объявлены в качестве входных данных. Если вы используете весьctx.files.attr_with_the_genruleв качестве входных данных для действия в нижестоящем правиле, то это действие будет выполняться повторно при изменении любого из них. Хитрость заключается в том, чтобы использовать какое-то другое правило (возможно, собственное), чтобы извлекать только те файлы, которые вы хотите использовать в качестве входных данных для действий.

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