Bazel 系统实现为长期有效的服务器进程。这样一来,它就可以执行许多无法通过以批处理为导向的实现执行的优化,例如从一个 build 到下一个 build 缓存 BUILD 文件、依赖项图和其他元数据。这样可以提高增量构建的速度,并允许不同的命令(如 build
和 query
)共享已加载软件包的同一缓存,从而加快查询速度。
运行 bazel
时,您将运行客户端。客户端会根据输出基础目录(默认由基础工作区目录的路径和您的用户 ID 决定)查找服务器,因此,如果您在多个工作区中进行构建,则会有多个输出基础目录,进而会有多个 Bazel 服务器进程。同一工作站上的多个用户可以在同一工作区中同时构建,因为他们的输出基数不同(用户 ID 不同)。如果客户端找不到正在运行的服务器实例,则会启动一个新实例。服务器进程会在无活动一段时间后停止(默认 3 小时,可使用启动选项 --max_idle_secs
进行修改)。
在大多数情况下,用户无法看到有服务器在运行,但有时记住这一点会很有帮助。例如,如果您要运行的脚本会在不同的目录中执行大量自动化 build,请务必确保不会积累大量空闲服务器;为此,您可以在使用完服务器后明确关闭它们,或者指定较短的超时期限。
Bazel 服务器进程的名称在 ps x
或 ps -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
时,客户端首先检查服务器版本是否合适;如果不是,则会停止服务器,然后启动新的服务器。这样可以确保使用长时间运行的服务器进程不会干扰正确的版本控制。