用戶端/伺服器實作

回報問題 查看原始碼 Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

Bazel 系統是以長期伺服器處理程序的形式實作。如此一來,它就可以透過批次導向的實作執行許多無法實現的最佳化,例如快取 BUILD 檔案、依附元件圖表,以及從一個建構到下一個建構中的其他中繼資料。這可加快漸進式建構的速度,並讓 buildquery 等不同指令共用已載入套件的相同快取,讓查詢速度加快。

執行 bazel 時,就是在執行用戶端。用戶端會根據輸出基礎尋找伺服器,而輸出基礎預設是由基礎工作區目錄路徑和使用者 ID 決定,因此如果您在多個工作區中建構,就會有多個輸出基礎和多個 Bazel 伺服器程序。同一個工作站上的多位使用者可以在同一個工作區中同時進行建構作業,因為他們的輸出基礎會有所不同 (使用者 ID 不同)。

如果用戶端找不到執行中的伺服器執行個體,就會啟動新的執行個體。方法是檢查輸出基礎是否已存在,表示 Blaze 封存檔已解壓縮。否則,如果輸出基礎不存在,用戶端會解壓縮封存檔案,並將其 mtime 設為 9 年後的日期。安裝完成後,用戶端會確認解壓縮檔案的 mtime 與遠端日期相同,以確保安裝過程未遭到竄改。

伺服器程序會在一段時間 (預設為 3 小時,可使用啟動選項 --max_idle_secs 修改) 後停止運作。在大多數情況下,使用者不會看到伺服器正在執行,但有時還是要注意這一點。舉例來說,如果您執行的腳本會在不同目錄中執行大量自動化建構作業,請務必確保不會累積大量閒置的伺服器。您可以透過在完成後明確關閉伺服器,或是指定較短的逾時期限來達成這點。

Bazel 伺服器程序的名稱會以 bazel(dirname) 的形式出現在 ps xps -e f 的輸出內容中,其中 dirname 是包含工作區目錄根目錄的目錄的 base 名稱。例如:

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

這樣一來,您就能更輕鬆地找出哪些伺服器程序屬於特定工作區。(請注意,如果使用 ps 的其他選項,Bazel 伺服器程序可能會只命名為 java)。您可以使用 shutdown 指令停止 Bazel 伺服器。

執行 bazel 時,用戶端會先檢查伺服器是否為適當的版本;如果不是,則會停止伺服器並啟動新的伺服器。這可確保長時間執行的伺服器程序不會干擾正確的版本管理。