客户端/服务器实现

报告问题 查看源代码

Bazel 系统实现为长期的服务器进程。这样一来,它便可以执行许多面向批量的实现无法执行的优化,例如缓存 build 文件、依赖项图以及从一个 build 到下一个 build 的其他元数据。这有助于提高增量构建的速度,并允许 buildquery 等不同命令共享已加载软件包的相同缓存,从而加快查询速度。

如果您运行 bazel,则正在运行客户端。客户端会根据输出基数查找服务器。输出基数默认由基本工作区目录的路径和 userid 确定,因此如果您在多个工作区中进行构建,将会有多个输出基站,因此具有多个 Bazel 服务器进程。同一工作站上的多个用户可以在同一工作区中并发构建,因为其输出基数不同(不同的用户 ID)。

如果客户端找不到正在运行的服务器实例,则会启动一个新的服务器实例。它会通过检查输出基数是否已存在(表示 blaze 归档文件已被解压缩)来实现此目的。否则,如果输出基础不存在,客户端会解压缩归档的文件,并将其 mtime 设置为未来 9 年的日期。安装后,客户端会确认解压缩文件的 mtime 等于最远的日期,以确保不会出现安装篡改的情况。

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

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

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

这样,您可以更轻松地确定哪个服务器进程属于某个工作区。(请注意,借助 ps 的其他某些选项,Bazel 服务器进程可以仅命名为 java。)您可以使用 off 命令停止 Bazel 服务器。

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