Google Bazel 构建工具可以很容易地解释特定目录树中的每个 CoffeeScript 文件都需要编译为相应的输出 JavaScript 文件:
# Runs "coffee" 100 times if there are 100 files:
# will run slowly if most of them need rebuilding.
[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 文件,这将单独调用咖啡工具 100 次,从而为编译过程增加许多秒。
或者,这可以写成一个命令,将 100 个文件作为输入并生成 100 个文件作为输出:
# Runs "coffee" once on all the files:
# very slow in the case that only 1 file was edited.
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)',
)
有什么方法可以向 Bazel 解释一下,可以一次使用多个文件调用咖啡,并且如果 N 个目标已过期,则只应将 N 个源文件提供给coffee
命令,而不是提供完整的所有目标是否需要重建?