客户端/服务器实现

报告问题 查看源代码 每夜 build · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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

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

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

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

Bazel 服务器进程的名称会以 bazel(dirname) 的形式显示在 ps xps -e f 的输出中,其中 dirname 是封装工作区目录根目录的目录的 basename。例如:

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

这样,您就可以更轻松地了解哪些服务器进程属于给定的工作区。(请注意,使用 ps 的某些其他选项时,Bazel 服务器进程可能只命名为 java。)可以使用 shutdown 命令停止 Bazel 服务器。

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