Bazel 系統是以長期伺服器處理程序的形式實作。如此一來,它就可以透過批次導向的實作執行許多無法實現的最佳化,例如快取 BUILD 檔案、依附元件圖表,以及從一個建構到下一個建構中的其他中繼資料。這可以改善漸進式建構的速度,並允許不同的指令 (例如 build
和 query
) 共用已載入套件的相同快取,因此能快速執行查詢。
執行 bazel
時,您會執行用戶端。用戶端會根據輸出基礎尋找伺服器,而輸出基礎預設是由基礎工作區目錄路徑和使用者 ID 決定,因此如果您在多個工作區中建構,就會有多個輸出基礎和多個 Bazel 伺服器程序。同一個工作站上的多位使用者可以在同一個工作區中同時進行建構作業,因為他們的輸出基礎會有所不同 (使用者 ID 不同)。如果用戶端找不到執行中的伺服器執行個體,就會啟動新的執行個體。伺服器程序會在閒置一段時間後 (預設為 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
時,用戶端會先檢查伺服器是否為適當的版本;如果不是,則會停止伺服器並啟動新的伺服器。如此可以確保長時間執行的伺服器程序並未乾擾適當的版本管理。