用戶端/伺服器實作

回報問題 查看原始碼

Bazel 系統作為長期伺服器處理程序。如此一來,就能執行無法透過批次導向實作執行的多項最佳化作業,例如快取 BUILD 檔案、依附元件圖,以及從一個版本到下一個版本的其他中繼資料。這可以改善漸進式建構作業的速度,並允許使用不同指令 (例如 buildquery) 共用已載入套件的相同快取,加快查詢速度。每個伺服器一次最多可處理一個叫用;進一步的並行叫用將會阻斷或快速失敗 (請參閱 --block_for_lock)。

執行 bazel 時,系統正在執行用戶端,用戶端會根據「輸出基礎」尋找伺服器,而根據預設,此伺服器是由基本工作區目錄的路徑和使用者 ID 決定,因此如果您在多個工作區中建構,就會有多個輸出基礎,進而導致多個 Bazel 伺服器處理程序。同一工作站中的多位使用者可以在同一個工作區中並行建構,因為其輸出基礎不同 (不同的使用者 ID)。

如果用戶端找不到執行中的伺服器執行個體,就會啟動新的伺服器。方法是檢查輸出集是否已存在,表示 Blaze 封存已經解除封裝。否則,如果輸出基礎不存在,用戶端會解壓縮封存的檔案,並將 mtime 設為未來 9 年的日期。安裝完成後,用戶端會確認已解壓縮檔案的 mtime 等於最遠的日期,確保不會發生安裝遭到竄改的情形。

閒置一段時間後 (預設為 3 小時,您可以使用啟動選項 --max_idle_secs 修改),伺服器處理程序就會停止。在大多數情況下,使用者看不到正在執行的伺服器,但有時可協助您瞭解這一點。舉例來說,如果您執行的指令碼會在不同目錄中執行大量自動化建構作業,您必須確保不會累積大量閒置伺服器;只要執行完畢後請明確關閉伺服器,或是指定較短的逾時期限,就可達到這個目的。

Bazel 伺服器程序的名稱在 ps xps -e f 的輸出內容中會顯示為 bazel(dirname),其中「dirname」dirname是涵蓋工作區目錄根目錄的目錄基準名稱。例如:

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

這樣就能輕鬆找出哪個伺服器程序屬於特定工作區。(請注意,若採取 ps 的其他選項,Bazel 伺服器程序可能只命名為 java)。您可以使用 關閉 指令來停止 Bazel 伺服器。

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