2016-05-11 3 views
0

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

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

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

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

ответ

3

Я не работал с кофе сценария, так что это, возможно, потребуется скорректировать (в частности, --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) 

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

+0

Спасибо. Теперь я понимаю, что мне нужно задать вопрос: есть ли способ создать Базель, чтобы избежать обеих проблем! Я спрошу это как отдельный вопрос. –