客户端/服务器实现

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

运行 bazel 时,您是在运行客户端。客户端根据输出基准查找服务器,输出基准默认由基本工作区目录的路径和 userid 确定。因此,如果您在多个工作区中构建,则有多个工作区从而输出多个 Bazel 服务器进程。同一工作站上的多个用户可以在同一个工作区中同时构建,因为其输出基准会有所不同(不同的用户 ID)。如果客户端找不到正在运行的服务器实例,它会启动一个新的实例。服务器进程会在一段闲置时间(默认为 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。)您可以使用 shutdown 命令停止 Bazel 服务器。

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