[译] Bazel 的 strategies 是什么?
原文:What are Bazel’s strategies? · Julio Merino · 2019 年 12 月 14 日。译文保留原文当时的技术描述。 “strategies?你要聊 Bazel 称霸世界的战略 🙀?”呃……不完全是。 过去几个月,dynamic execution 一直是我工作中的热门话题,我也正准备写一系列文章来介绍它。不过,在此之前,得先回顾一下 Bazel 的 execution strategies。要理解 dynamic execution 是什么、如何实现,execution strategies 很重要。 简单来说,strategies 是 Bazel 对一套子进程运行机制的抽象,用于执行 action 的一部分工作,比如调用编译器。它们本质上就是加强版的 Unix exec() 系统调用或 Windows CreateProcess,能让子进程在差别很大的环境中运行。 不过,有一条约束始终不变:strategy 不影响执行语义。也就是说,同一条命令行交给 strategy A 和 strategy B 执行,必须生成相同的输出文件。因此,切换 strategy 不会让 analysis graph 失效。 有了这个保证,就可以在运行时混用不同的 strategy,而不影响输出行为。Bazel 通过可重复指定的 --strategy 参数提供这项能力,参数值的形式是 [mnemonic]=strategy。你可以用它指定某一类 action 使用哪个 strategy。例如,--strategy=remote --strategy=Javac=worker 会把默认 strategy 设为 remote,只有 Java 编译使用 worker。另外,--strategy_regexp 可以根据 action message 选择 strategy,不过这里先不谈这套“魔法”。Bazel 也有一些挺巧妙的机制,支持自动选择 strategy。 ...