Bazel 系統是以長效伺服器程序實作。這可讓系統執行許多無法透過以批次為導向的實作方式達成的最佳化作業,例如快取 BUILD 檔案、依附元件圖表和其他中繼資料,從一個版本傳遞到下一個版本。這可加快漸進式建構的速度,並讓 build
和 query
等不同指令共用已載入套件的相同快取,讓查詢速度加快。每個伺服器每次最多只能處理一次叫用作業;後續的並行叫用作業將會遭到封鎖或快速失敗 (請參閱 --block_for_lock
)。
執行 bazel
時,您會執行用戶端。用戶端會根據輸出基地尋找伺服器,預設情況下,輸出基地會根據基礎工作區目錄路徑和使用者 ID 決定,因此如果您在多個工作區中建構,就會有多個輸出基地和多個 Bazel 伺服器程序。同一個工作站上的多位使用者可以在同一個工作區中同時進行建構作業,因為他們的輸出基礎會有所不同 (使用者 ID 不同)。
如果用戶端找不到執行中的伺服器執行個體,就會啟動新的執行個體。方法是檢查輸出基礎是否已存在,表示 blaze 封存檔已解壓縮。否則,如果輸出基礎不存在,用戶端會解壓縮封存檔案,並將其 mtime
設為 9 年後的日期。安裝完成後,用戶端會確認解壓縮檔案的 mtime
與遠端日期相同,以確保安裝過程未遭到竄改。
伺服器程序會在一段時間 (預設為 3 小時,可使用啟動選項 --max_idle_secs
修改) 後停止運作。在大多數情況下,使用者不會看到伺服器正在運作,但有時還是要注意這一點。舉例來說,如果您執行的腳本會在不同目錄中執行大量自動化建構作業,請務必確保不會累積大量閒置的伺服器。您可以透過在完成後明確關閉伺服器,或是指定較短的逾時期限來達成這點。
Bazel 伺服器程序的名稱會以 bazel(dirname)
的形式出現在 ps x
或 ps -e f
的輸出內容中,其中 dirname 是包含工作區目錄根目錄的目錄的 base 名稱。例如:
ps -e f
16143 ? Sl 3:00 bazel(src-johndoe2) -server -Djava.library.path=...
這樣一來,您就能更輕鬆地找出哪些伺服器程序屬於特定工作區。(請注意,如果使用 ps
的其他選項,Bazel 伺服器程序可能會只命名為 java
)。您可以使用 shutdown 指令停止 Bazel 伺服器。
執行 bazel
時,用戶端會先檢查伺服器是否為適當的版本;如果不是,則會停止伺服器並啟動新的伺服器。這可確保長時間執行的伺服器程序不會干擾正確的版本管理。