Bazel 系統會實作成長期執行的伺服器程序。因此,Bazel 可以執行許多以批次為導向的實作方式無法進行的最佳化作業,例如從一個建構作業到下一個建構作業,快取 BUILD 檔案、依附元件圖和其他中繼資料。這可加快漸進式建構的速度,並允許 build
和 query
等不同指令共用已載入套件的相同快取,大幅加快查詢速度。每個伺服器一次最多只能處理一個叫用;進一步的並行叫用會遭到封鎖或快速失敗 (請參閱 --block_for_lock
)。
執行 bazel
時,您執行的就是用戶端。用戶端會根據輸出基準尋找伺服器,而輸出基準預設是由基準工作區目錄的路徑和您的使用者 ID 決定。因此,如果您在多個工作區中建構,就會有多個輸出基準,進而產生多個 Bazel 伺服器程序。同一工作站上的多位使用者可以在同一工作區中同時建構,因為他們的輸出基礎會有所不同 (不同的使用者 ID)。
如果用戶端找不到正在執行的伺服器執行個體,就會啟動新的執行個體。方法是檢查輸出基礎是否已存在,這表示 Blaze 封存檔已解壓縮。否則,如果輸出基準不存在,用戶端會解壓縮封存檔的檔案,並將 mtime
設為 9 年後的日期。安裝完成後,用戶端會確認解壓縮檔案的 mtime
s 是否等於遠端日期,確保安裝過程未遭竄改。
伺服器程序會在閒置一段時間後停止 (預設為 3 小時,可使用啟動選項 --max_idle_secs
修改)。在大多數情況下,使用者不會察覺伺服器正在執行,但有時記住這點會有幫助。舉例來說,如果您執行的指令碼會在不同目錄中執行大量自動建構作業,請務必確保不會累積大量閒置伺服器;您可以明確關閉伺服器,或指定較短的逾時時間,藉此達成目的。
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
時,用戶端會先檢查伺服器是否為適當版本,如果不是,系統會停止伺服器並啟動新的伺服器。這可確保長時間執行的伺服器程序不會干擾正確的版本控管。