Можно ли указать Базелу использовать одну команду для обновления N целей?

Инструмент сборки Google Bazel позволяет достаточно легко объяснить, что каждый файл CoffeeScript в определенном дереве каталогов должен быть скомпилирован в соответствующий выходной файл JavaScript:

[genrule(
    name = 'compile-' + f,
    srcs = [f],
    outs = [f.replace('src/', 'static/').replace('.coffee', '.js')],
    cmd = 'coffee --compile --map --output $$(dirname $@) $<',
) for f in glob(['src/**/*.coffee'])]

Но учитывая, скажем, 100 файлов CoffeeScript, это вызовет инструмент coffee 100 раз, добавляя много секунд к процессу компиляции. Если вместо этого можно было бы объяснить Bazel, что команда coffee может принимать множество входных файлов в качестве входных, тогда файлы можно было бы объединить вместе и предложить меньшее количество coffee вызовов, позволяя амортизировать время запуска процесса для большего количества файлов, чем только один.

Есть ли способ объяснить Базелу, что coffee может быть запущен с множеством файлов одновременно?


person Brandon Rhodes    schedule 11.05.2016    source источник


Ответы (1)


Я не работал со сценарием кофе, поэтому его, возможно, придется отрегулировать (особенно часть --output @D), но что-то вроде этого может сработать:

coffee_files = glob(['src/**/*.coffee'])

genrule(
    name = 'compile-coffee-files',
    srcs = coffee_files,
    outs = [f.replace('src/', 'static/').replace('.coffee', '.js') for f in coffee_files],
    cmd = 'coffee --compile --map --output @D $(SRCS)' % coffee)

Обратите внимание, что если изменить только один входной файл сценария кофе, все общее правило будет перезапущено со всеми 100 файлами (так же, как, скажем, с java_library со 100 входными файлами java).

person ahumesky    schedule 12.05.2016
comment
Спасибо - теперь я понимаю, что мне нужно задать вопрос: есть ли способ настроить Базель, чтобы избежать обеих проблем! Я задам это как отдельный вопрос. - person Brandon Rhodes; 13.05.2016