用戶端/伺服器實作

回報問題 查看來源

Bazel 系統是以長期伺服器程序的形式導入。藉此執行批次導向的多項最佳化作業,例如從一個版本快取 BUILD 檔案、依附元件圖表和其他中繼資料到下一個版本。這樣做可以改善漸進式建構的速度,並允許不同的指令 (例如 buildquery) 共用已載入套件的快取,讓查詢得以快速執行。

執行 bazel 時,您正在執行用戶端。用戶端會根據輸出基礎尋找伺服器,根據預設,取決於基本工作區目錄和您的使用者 ID。因此,如果您建立了多個工作區,就會有多個輸出集,因此有多個 Bazel 伺服器程序。同一工作站上的多位使用者可以在同一個工作區中同時建構,因為其輸出集會有所不同 (不同的使用者 ID)。

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

伺服器程序會在閒置一段時間後 (預設為 3 小時,使用啟動選項 --max_idle_secs 修改) 並停止伺服器;最重要的是,使用者無法看到執行中的伺服器,不過在某些情況下,這樣做會有所幫助。例如,如果您要執行的指令碼是在不同的目錄中執行大量自動化建構,請務必確保這些伺服器不會花費大量的閒置伺服器,方法是在伺服器結束時加以關閉,或是指定較短的逾時期間。

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

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

這樣就能輕鬆辨別哪個伺服器程序屬於特定工作區。(請注意,除了 ps 以外的特定選項,Bazel 伺服器程序可能只會命名為 java)。您可以使用 off 指令停止 Bazel 伺服器。

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