是否可以指示 Bazel 使用单个命令来更新 N 个目标?

Can Bazel be instructed to use a single command for updating N targets?

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 调用,从而允许进程的启动时间摊销到更多的文件而不是一个文件。

有没有办法向 Bazel 解释 coffee 可以同时调用多个文件?

我没有使用过咖啡脚本,所以这可能需要调整(特别是 --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 个文件(与具有 100 个输入 java 文件的 java_library 相同) ).