客户端/服务器实现

报告问题 查看源代码

Bazel 系统是作为长期有效的服务器进程实现的。这样,它可以执行许多在面向批量的实现中无法实现的优化,例如将 build 文件、依赖关系图和其他元数据从一个 build 缓存到另一个 build。这提高了增量构建的速度,并允许不同的命令(如 buildquery)共享已加载软件包的同一缓存,从而使查询变得非常快。每个服务器一次最多只能处理一个调用;后续的并发调用将阻塞或快速失败(请参阅 --block_for_lock)。

运行 bazel 即表示您正在运行客户端。客户端根据输出基准查找服务器,输出基准由工作区基本目录的路径和您的 userid 决定,因此如果您在多个工作区中进行构建,将有多个输出基准,因此会有多个 Bazel 服务器进程。同一工作站上的多个用户可在同一工作区中同时构建,因为他们的输出库有所不同(不同的用户 ID)。

如果客户端找不到正在运行的服务器实例,则会启动一个新服务器实例。为此,它会检查输出库是否已存在,这意味着 blaze 归档已解压缩。否则,如果输出库不存在,客户端会解压缩归档的文件,并将其 mtime 设置为 9 年后的日期。安装后,客户端会确认解压缩文件的 mtime 为远离日期,以确保未发生安装篡改。

服务器进程将在一段时间(默认 3 小时,可以使用启动选项进行修改,可以使用启动选项 --max_idle_secs)后停止。大多数情况下,用户看不到服务器正在运行这一情况,但有时考虑到这一点会有帮助。例如,如果您运行的是在不同目录中执行大量自动构建的脚本,请务必确保不会积累大量空闲服务器;为此,您可以在使用完服务器后明确将其关闭,或者指定较短的超时期限。

Bazel 服务器进程的名称在 ps xps -e f 的输出中显示为 bazel(dirname),其中 dirname 是包含工作区目录根目录的目录的基名。dirname例如:

ps -e f
16143 ?        Sl     3:00 bazel(src-johndoe2) -server -Djava.library.path=...

这样可以更轻松地找出属于给定工作区的服务器进程。(请注意,对于 ps 的某些其他选项,Bazel 服务器进程可能仅命名为 java。)可以使用关闭命令停止 Bazel 服务器。

运行 bazel 时,客户端会先检查服务器的版本是否正确;如果不是,则会停止服务器并启动一个新服务器。这样可确保使用长时间运行的服务器进程不会干扰适当的版本控制。