2022 年 BazelCon 将于 11 月 16 日至 17 日在纽约和线上举办。
立即报名!

从脚本调用 Bazel

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

您可以从脚本调用 Bazel 来执行构建、运行测试或查询依赖项图。Bazel 旨在实现有效的脚本,但本部分列出了一些需要注意的细节,以提高脚本的稳健性。

选择输出库

--output_base 选项可控制 Bazel 进程应将构建输出写入哪个位置,以及 Bazel 内部使用的各种工作文件,其中一个文件是用于防止并发更改的锁 基于多个 Bazel 进程的输出基准。

为脚本选择正确的输出基本目录取决于多种因素。如果您需要将构建输出放置在特定位置,这将决定您需要使用的输出基准。如果您正在对 Bazel(例如 bazel query)进行“只读”调用,则锁定因素将更重要。具体而言,如果您需要同时运行脚本的多个实例,则需要为每个实例提供不同(或随机)的输出基准。

如果您使用默认输出基准值,就会与用户的交互式 Bazel 命令使用的锁竞争。如果用户发出长时间运行的命令(如构建),脚本必须等待这些命令完成后才能继续。

有关服务器模式的注意事项

默认情况下,Bazel 会使用长时间运行的服务器进程进行优化。在脚本中运行 Bazel 时,请不要忘记在完成服务器之后调用 shutdown,或指定 --max_idle_secs=5 以便空闲服务器立即自行关闭。

我将收到什么样的退出代码?

Bazel 会将因考虑中的源代码导致的失败问题与阻止 Bazel 正确执行的外部错误区分开来。Bazel 执行可能会导致以下退出代码:

所有命令通用的退出代码

  • 0 - 成功
  • 2 - 命令行问题、非法或非法标志或命令组合,或不良环境变量。您必须修改命令行。
  • 8 - 构建中断,但我们按顺序关停。
  • 9 - 服务器锁定被保留,且 --noblock_for_lock 通过。
  • 32 - 此设备上没有外部环境故障。

  • 33 - Bazel 内存不足并已崩溃。您需要修改命令行。

  • 34 - 供 Google 内部使用。

  • 35 - 供 Google 内部使用。

  • 36 - 本地环境问题,疑似永久性。

  • 37 - 未处理的异常 / 内部 Bazel 错误。

  • 38 - 供 Google 内部使用。

  • 41-44 - 供 Google 内部使用。

  • 45 - 将结果发布到构建事件服务时出错。

  • 47 - 供 Google 内部使用。

返回 bazel buildbazel test 命令的代码

  • 1 - 构建失败。
  • 3 - 构建成功,但某些测试失败或超时。
  • 4 - 构建成功,但虽然提出了测试请求,但未找到任何测试。

对于 bazel run

  • 1 - 构建失败。
  • 如果构建成功,但执行的子进程返回非零退出代码,该代码也会成为该命令的退出代码。

对于 bazel query

  • 3 - 部分成功,但查询在 BUILD 文件集中出现 1 个或多个错误,因此操作结果并不完全可靠。这可能是由于命令行中存在 --keep_going 选项。
  • 7 - 命令失败。

未来的 Bazel 版本可能会添加其他退出代码,并将通用失败退出代码 1 替换为具有特定含义的其他非零值。但是,所有非零退出值将始终构成错误。

读取 .yamlrc 文件

默认情况下,Bazel 会从基本工作区目录或用户的主目录读取 .bazelrc 文件。该脚本是否合适是您的脚本的选择;如果您的脚本需要完全封闭(例如在执行发布构建时),则应使用 --bazelrc=/dev/null 选项停用读取 .yamlrc 文件。如果要使用用户的首选设置执行构建,默认行为会更好。

命令日志

Bazel 输出也位于命令日志文件中,您可以通过以下命令找到该文件:

bazel info command_log

命令日志文件包含最新 Bazel 命令的交错 stdout 和 stderr 流。请注意,运行 bazel info 会覆盖此文件的内容,因为它随后将成为最新的 Bazel 命令。但是,除非您更改 --output_base--output_user_root 选项的设置,否则命令日志文件的位置不会更改。

解析输出

Bazel 输出非常易于解析,可用于多种用途。可能对您的脚本有帮助的两个选项是 --noshow_progress(禁止显示进度消息)和 --show_result n(控制是否输出“构建最新”消息) ;系统可能会解析这些消息,以找出成功构建了哪些目标,以及它们所创建的输出文件的位置。如果您依赖这些消息,请务必指定非常大的 n 值。

通过分析来排查性能问题

请参阅性能分析部分。