从脚本调用 Bazel

<ph type="x-smartling-placeholder"></ph> 报告问题 <ph type="x-smartling-placeholder"></ph> 查看来源 每晚 · 7.2 条 · 7.1敬上 · 7.0 · 6.5 · 6.4

您可以从脚本调用 Bazel 以执行构建、运行测试或查询 依赖关系图Bazel 的设计初衷就是支持编写有效的脚本 本部分列出了需要注意的一些细节,可让您的脚本 稳健。

选择输出基准

--output_base 选项控制 Bazel 进程应在何处写入 以及供内部使用的各种工作文件 Bazel,其中一个是锁,用于防止 根据多个 Bazel 进程的输出

为脚本选择正确的输出基本目录取决于 因素。如果您需要将构建输出放在特定位置 规定需要使用的输出库。如果您将作业设为“只读”调用 Bazel(例如 bazel query),锁定因素会更为重要。在 特别是,如果您需要同时运行脚本的多个实例, 请注意,每个 Blaze 服务器进程最多只能处理一个 一次调用。 根据您的具体情况,它可能适合脚本的每个实例。 等待轮到它,或者使用 --output_base 运行多个 Blaze 服务器,然后使用这些服务器。

如果您使用默认的输出基数值, 所有交互式 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 - 将结果发布到构建事件服务时出现暂时性错误。

  • 39 - 从远程缓存中逐出 Bazel 所需的 Blob。

  • 41-44 - 留给 Google 内部使用。

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

  • 47 - 留给 Google 内部使用。

  • 49 - 留给 Google 内部使用。

返回命令 bazel buildbazel test 的代码

  • 1 - 构建失败。
  • 3 - 构建正常,但部分测试失败或超时。
  • 4 - 构建成功,但未找到测试,尽管测试 请求。

对于 bazel run

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

对于 bazel query

  • 3 - 部分成功,但查询在 输入 BUILD 文件集,因此操作结果不是 100% 可靠性。这可能是由于命令行中的 --keep_going 选项造成的。
  • 7 - 命令失败。

未来的 Bazel 版本可能会添加其他退出代码,以取代常规失败 具有特定含义的其他非零值退出代码 1。 不过,所有非零退出值始终都会构成错误。

读取 .bazelrc 文件

默认情况下,Bazel 会从以下目录读取 .bazelrc 文件: 工作区目录或用户的主目录。无论 为您的脚本选择最合适的值必须确保脚本 封闭式(例如在进行发布构建时),因此您应该停止读取 .bazelrc 文件。--bazelrc=/dev/null如果您想执行 使用用户的偏好设置的 build 时,默认行为会更好。

命令日志

Bazel 输出也可以在命令日志文件中找到,您可以使用 以下命令:

bazel info command_log

命令日志文件包含 运行最新 Bazel 命令请注意,运行 bazel info 会覆盖 此文件的内容,因为这样它就会成为最新的 Bazel 命令。 但是,除非您将命令日志文件 --output_base--output_user_root 选项的设置。

解析输出

Bazel 输出易于解析,可用于多种用途。 对脚本有帮助的 --noshow_progress 会抑制进度 还有 --show_result n,后者用于控制 而不是“构建最新版本”输出消息;这些消息可能会被解析为 了解成功构建的目标以及输出的位置 文件。如果您依赖于 这些消息

通过分析排查性能问题

请参阅性能剖析部分。