Bazel 系统以长期运行的服务器进程的形式实现。这样,它就可以执行许多在面向批处理的实现中无法执行的优化,
例如缓存 BUILD 文件、依赖关系图和其他元数据,以便从一个
build 传递到下一个 build。这提高了增量 build 的速度,并允许
不同的命令(例如 build 和 query)共享同一缓存的
已加载软件包,从而使查询速度非常快。每个服务器一次最多只能处理一个
调用;进一步的并发调用要么会阻塞,要么会
快速失败(请参阅--block_for_lock)。
运行 bazel 时,您运行的是客户端。客户端会根据输出库查找服务器
,默认情况下,输出库由基本工作区目录的路径和您的用户 ID
决定,因此,如果您在多个工作区中进行 build,则会有多个输出库,因此会有多个 Bazel 服务器进程
。同一工作站上的多个用户可以在同一工作区中同时进行
build,因为他们的输出库会有所不同
(不同的用户 ID)。
如果客户端找不到正在运行的服务器实例,它会启动一个新实例。它
会通过检查输出库是否已存在来执行此操作,这意味着 blaze
归档文件已解压缩。否则,如果输出库不存在,
客户端会解压缩归档文件的文件,并将其 mtime 设置为 9 年
后的日期。安装后,客户端会确认解压缩文件的 mtime 是否等于遥远的日期,以确保未发生任何安装篡改。
服务器进程会在一段时间不活动后停止(默认情况下为 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 时,客户端首先会检查服务器是否为适当的
版本;如果不是,则服务器会停止并启动新服务器。这可确保
使用长期运行的服务器进程不会干扰正确的
版本控制。