用戶端/伺服器實作

回報問題 查看來源

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

執行 bazel 時,就是在執行用戶端。用戶端會依據輸出基本找到伺服器,而預設依據基本工作區目錄的路徑和使用者 ID 決定了這類伺服器。因此,如果您在多個工作區中進行建構,就會擁有多個輸出基準,因此會有多個 Bazel 伺服器處理程序。同一個工作站中的多位使用者可以在同一工作區中同時建構,因為各自的輸出庫不同 (使用者 ID 不同)。如果用戶端找不到執行中的伺服器執行個體,則會啟動新的執行個體。伺服器程序會在閒置一段時間後 (預設為 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)。您可以使用 關機 指令停止 Bazel 伺服器。

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