gpt4 book ai didi

bazel - Bazel 能否将需要重建的 M 个文件中的 N 个批处理成单个命令?

转载 作者:行者123 更新时间:2023-12-01 08:23:50 25 4
gpt4 key购买 nike

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 命令,而不是所有目标的完整列表,无论它们是否需要重建?

最佳答案

coffeescript 文件是否相互独立?如果第一个有效,每个文件分别通过 coffee 运行,那么它看起来是这样。在那种情况下,第一个实际上会给你最大的并行性和增量。

即使使用 100 个文件运行 100 次 coffee 比运行一次 coffee 慢,您也只需在第一次编译所有内容时支付该费用。当您更改 1 个文件时,不会重新编译其他 99 个文件。但是,如果 coffee 的启动时间太长以至于 100 个文件实际上可以忽略不计,那么您还不如坚持将它们全部编译成一个大类。

在两个极端之间折衷的一种方法是创建一个宏:http://bazel.io/docs/skylark/macros.html

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

然后您可以在构建文件中使用 compile_coffee 宏,将您的构建组织成适当大小的目标:

load("//pkg/path/to:coffee.bzl", "compile_coffee")

compile_coffee(
name = "lib",
srcs = glob(["*.coffee"]))

还有完整的 lark 规则:http://bazel.io/docs/skylark/rules.html但是如果 CoffeeScript 文件并不真正相互依赖,那么这可能就没有必要了。

还有坚持不懈的 worker :http://bazel.io/blog/2015/12/10/java-workers.html这允许你保持一个正在运行的咖啡实例,这样你就不必支付启动成本,但二进制文件必须表现良好,并且需要更多的投资,因为你通常必须按顺序编写包装器连接一切。

关于bazel - Bazel 能否将需要重建的 M 个文件中的 N 个批处理成单个命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37213921/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com