您可以从脚本调用 Bazel 来执行构建、运行测试或查询 依赖关系图。Bazel 旨在实现有效的脚本编写,但 本部分列出了一些需要注意的详细信息,以使您的脚本更加 稳健。
选择输出库
--output_base 选项用于控制 Bazel 进程应将构建的
输出写入到何处,以及 Bazel 在内部使用的各种工作文件,其中一个工作文件是用于防止多个 Bazel 进程同时更改输出库的锁。
为脚本选择正确的输出库目录取决于多种因素。如果您需要将构建输出放在特定位置,这将
决定您需要使用的输出库。如果您要对 "read only" 调用
Bazel(例如 bazel query),则锁定因素会更加重要。特别是,如果您需要同时运行脚本的多个实例,则应注意,每个 Blaze 服务器进程一次最多只能处理一个
调用 at a time。根据具体情况,脚本的每个实例
可能需要依次等待,或者使用 --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- 向 Build Event Service 发布结果时出现暂时性错误。39- Bazel 所需的 Blob 从远程缓存中逐出。41-44- 留待 Google 内部使用。45- 向 Build Event Service 发布结果时出现永久性错误。47- 留待 Google 内部使用。49- 留待 Google 内部使用。
命令 bazel build、bazel test 的返回代码:
1- 构建失败。3- 构建成功,但某些测试失败或超时。4- 构建成功,但即使请求了测试,也没有找到任何测试。
对于 bazel run:
1- 构建失败。- 如果构建成功,但执行的子进程返回非零退出 代码,则该代码也将是命令的退出代码。
对于 bazel query:
3- 部分成功,但查询在输入 BUILD 文件集中遇到一个或多个错误,因此操作结果并非 100% 可靠。这可能是因为命令行中使用了--keep_going选项。7- 命令失败。
未来的 Bazel 版本可能会添加其他退出代码,将通用失败
退出代码 1 替换为具有特定含义的不同非零值。
不过,所有非零退出值始终构成错误。
读取 .bazelrc 文件
默认情况下,Bazel 会从基本
工作区目录或用户的主目录读取 .bazelrc 文件。这是否
可取取决于您的脚本;如果您的脚本需要完全
密封(例如在执行发布构建时),您应使用 --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 则用于控制是否打印“构建最新”消息;您可以解析这些消息,以发现哪些目标已成功构建,以及它们创建的输出
文件的位置。如果您依赖
这些消息,请务必指定非常大的 n 值。
通过分析排查性能问题
请参阅性能分析部分。