优化迭代速度

报告问题 查看来源 每晚 · 7.2。 · 7.1敬上 · 7.0 · 6.5 · 6.4

本页介绍如何在运行 Bazel 时优化 Bazel 的构建性能 。

Bazel 的运行时状态

Bazel 调用涉及多个交互部分。

  • bazel 命令行界面 (CLI) 是面向用户的前端工具 并接收来自用户的命令

  • CLI 工具会启动一个 Bazel 服务器 每个不同的输出基准。 Bazel 服务器通常持续存在,但在一些空闲后会关闭 这样才不会浪费资源

  • Bazel 服务器会针对给定命令执行加载和分析步骤 (buildruncquery 等)中,该函数在其中构造必要的部分, 内存中构建图的位置生成的数据结构会保留在 作为分析缓存的一部分的 Bazel 服务器。

  • Bazel 服务器也可以执行操作 远程执行(如果已设置为远程执行)。通过 操作执行也会被缓存,即存储在操作缓存中(或者 执行缓存,该缓存可以是本地的,也可以是远程的,并且可以共享 运行 Bazel 服务器之间。

  • 输出树中会提供 Bazel 调用的结果。

以迭代方式运行 Bazel

在典型的开发者工作流中,构建(或运行)一段代码是很常见的做法 通常以非常高的频率反复进行(例如,为了解决某些编译 或调查失败的测试)。在这种情况下,务必要注意 相对于bazel 底层的重复操作(例如调用编译器或执行测试)。

有鉴于此,我们再来看一下 Bazel 的运行时状态:

分析缓存是一段关键数据。花费大量时间 只需用于冷运行(即 在 Bazel 服务器启动或分析缓存被舍弃时)。 对于单次成功的冷 build(例如,对于正式版),此成本为 但对于反复构建相同的目标, 费用会摊销,并且不会在每次调用时重复。

分析缓存非常不稳定。首先,它是事件处理流程的一部分, Bazel 服务器的状态,因此丢失服务器将失去缓存。但缓存 也很容易失效:例如,许多 bazel 命令行标志 会导致缓存被舍弃这是因为许多标志都会影响构建 (例如,由于 可配置的属性)。部分标志 也会导致 Bazel 服务器重启(例如,更改 启动选项)。

良好的执行缓存对于构建性能也很重要。执行 缓存可以保存在本地 磁盘上,或 远程。缓存可以共享给 而开发者的确如此

避免舍弃分析缓存

如果分析缓存被舍弃或 已重启服务器。在迭代使用期间,应避免以下任一情况:

  • 请注意在迭代过程中更改 bazel 标志 工作流。例如,混用 bazel build -c optbazel cquery 会使每个命令舍弃另一个命令的分析缓存。一般来说, 可以尝试在特定工作流的持续时间内使用一组固定的标志。

  • 一旦丢失 Bazel 服务器,分析缓存便会丢失。Bazel 服务器有一个 可配置空闲 之后便会关闭您可以通过 bazelrc 文件。服务器在启动时也会重启 标志会发生变化,因此请再次避免更改这些标志(如果可能)。

  • 请注意,如果您按 在 Bazel 运行时反复使用 Ctrl-C。很想节省时间 中断不再需要的正在运行的构建,但只需按 按一次 Ctrl-C 可请求正常结束当前调用。

  • 如果您想使用同一工作区中的多组标志,可以 使用多个不同的输出碱基,可通过 --output_base 进行切换 标记。每个输出库都有自己的 Bazel 服务器。