您可以从脚本调用 Bazel,以执行构建、运行测试或查询依赖关系图。Bazel 的设计宗旨是实现有效的脚本,但本部分列出了一些需要注意的细节,可让您的脚本变得更强大。
选择输出基准
--output_base
选项用于控制 Bazel 进程应将构建的输出写入到何处,以及 Bazel 在内部使用的各种工作文件,其中一个是锁,用于防止多个 Bazel 进程对输出库进行并发更改。
为脚本选择正确的输出基本目录取决于多种因素。如果您需要将构建输出放在特定位置,这将决定您需要使用的输出基准。如果您对 Bazel 进行“只读”调用(例如 bazel query
),锁定因素将更加重要。特别是,如果您需要同时运行脚本的多个实例,则应注意,每个 Blaze 服务器进程一次最多只能处理一个调用。根据您的具体情况,可以让脚本的每个实例等待其运行,也可以使用 --output_base
运行多个 Blaze 服务器并使用这些服务器。
如果您使用默认输出基本值,则需要争用用户的交互式 Bazel 命令所使用的锁。如果用户发出长时间运行的命令(例如 build),您的脚本必须等待这些命令完成后才能继续运行。
关于服务器模式的注意事项
默认情况下,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 build
和 bazel test
的返回代码:
1
- 构建失败。3
- 构建正常,但有些测试失败或超时。4
- 构建成功,但即使请求了测试,也未找到任何测试。
对于 bazel run
:
1
- 构建失败。- 如果构建成功,但已执行的子进程返回非零退出代码,则它也将是命令的退出代码。
对于 bazel query
:
3
- 部分成功,但查询在输入 BUILD 文件集中遇到 1 个或多个错误,因此操作结果并非 100% 可靠。这可能是因为命令行中有--keep_going
选项。7
- 命令失败。
未来的 Bazel 版本可能会添加其他退出代码,并将通用失败退出代码 1
替换为具有特定含义的其他非零值。不过,所有非零的退出值始终都会构成错误。
读取 .bazelrc 文件
默认情况下,Bazel 会从基本工作区目录或用户的主目录中读取 .bazelrc
文件。您的脚本可否采用此方式;如果您的脚本需要完全封闭(例如在进行发布 build 时),应使用 --bazelrc=/dev/null
选项禁止读取 .bazelrc 文件。如果您想使用用户的偏好设置执行构建,默认行为会更好。
命令日志
您还可以在命令日志文件中找到 Bazel 输出,您可以通过以下命令找到该文件:
bazel info command_log
命令日志文件包含最新 Bazel 命令的交错的 stdout 和 stderr 流。请注意,运行 bazel info
会覆盖此文件的内容,因为它随后会成为最新的 Bazel 命令。但是,除非您更改 --output_base
或 --output_user_root
选项的设置,否则命令日志文件的位置不会更改。
解析输出
为实现多种目的,Bazel 输出很容易解析。--noshow_progress
和 --show_result n
可能对您的脚本很有帮助,前者可抑制进度消息,后者用于控制是否输出“build 最新”消息;系统可能会解析这些消息,以发现已成功构建的目标及其创建的输出文件的位置。如果您依赖于这些消息,请务必指定一个非常大的值 n。
通过分析排查性能问题
请参阅性能分析部分。