客户端/服务器实现

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

运行 bazel 时,您运行的是客户端。客户端会根据输出库查找服务器 ,默认情况下,输出库由基本 工作区目录的路径和您的用户 ID 决定,因此,如果您在多个工作区中进行 build, 则会有多个输出库,因此会有多个 Bazel 服务器进程。 同一工作站上的多个用户可以在同一 工作区中同时进行 build,因为他们的输出库不同(不同的用户 ID)。如果 客户端找不到正在运行的服务器实例,则会启动一个新实例。服务器进程会在一段时间不活动后停止(默认情况下为 3 小时,可以使用启动选项 --max_idle_secs 进行修改)。

在大多数情况下,用户看不到服务器正在运行,但有时记住这一点很有帮助。例如,如果您运行的脚本会在不同目录中执行大量自动化 build,请务必确保不会累积大量空闲服务器;您 可以在完成服务器后显式关闭它们,或者 指定较短的超时时间段。

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 时,客户端会先检查服务器是否为适当的 版本;如果不是,则会停止服务器并启动新服务器。这样可确保 使用长期运行的服务器进程不会干扰正确的 版本控制。