本頁將說明密封性、使用密封式建構的優點,以及在建構中識別非密封式行為的策略。
總覽
當提供相同的輸入來源程式碼和產品設定時,密封式建構系統會將建構作業與主機系統的變更隔離,因此一律會傳回相同的輸出內容。
為了隔離建構作業,密封的建構對程式庫沒有敏感性 本機或遠端主機電腦上安裝的其他軟體。取決於 和依附元件等特定建構工具版本 程式庫這樣一來,建構程序就會自給自足,因為它不依賴建構環境以外的服務。
密封性有兩個重要面向:
- 隔離:密封式建構系統會將工具視為原始碼。他們 下載工具副本、管理儲存空間,以及在受管理的檔案中使用 樹木這項設定會在主機機器和本機使用者之間設立隔離 包括已安裝的語言版本
- 來源識別:密封式建構系統會盡力確保輸入內容的一致性。Git 等程式碼存放區 不重複的雜湊碼。密封式建構系統會使用這個雜湊值,找出建構作業輸入內容的變更。
優點
密封版本的主要優點包括:
- 速度:動作的輸出內容可快取,除非輸入內容變更,否則動作不必再次執行。
- 平行執行:對於給定的輸入和輸出內容,建構系統可以 建構所有操作的圖表,計算有效和平行 建構系統會載入規則並計算動作圖 並雜湊輸入內容在快取中查詢
- 多項建物:您可以在同一個上建構多個密封的建物 每次建構時,都會使用不同的工具和版本。
- 可重現性:密封式版本可讓您瞭解產生版本的確切條件,因此非常適合用於疑難排解。
找出非密封性
如果您正在準備改用 Bazel,只要能 「現有版本」先從一方面去學習常見的 以下為:
- 在
.mk
檔案中進行任意處理 - 非確定性地建立檔案的動作或工具,通常涉及 版本 ID 或時間戳記
- 主機之間不同的系統二進位檔 (例如
/usr/bin
二進位檔、絕對路徑、系統 C++ 編譯器,適用於原生 C++ 規則自動設定) - 在建構期間寫入原始碼樹狀結構。這可避免相同的來源資料 其他目標使用這種樹狀結構第一個版本會寫入來源樹狀結構,修正目標 A 的來源樹狀結構。那麼嘗試建置目標 B 之後 失敗。
排解非密封式建構問題
從本機執行開始,會影響本機快取命中的問題會顯示 非密封的動作
- 確保空值的順序建構:如果您執行
make
並順利建構,再次執行建構作業時,不應重新建構任何目標。如果您執行每個建構步驟兩次或在不同系統上執行,比較檔案內容的雜湊值並取得不同的結果,則無法重現建構作業。 - 執行步驟 在本機快取命中偵錯 從多種不同的用戶端機器中存取,以確保您能夠 用戶端環境洩漏到行動中的案例。
- 在 Docker 容器中執行建構作業,該容器只包含已簽出的來源樹狀結構和主機工具的明確清單。建構中斷和錯誤訊息會擷取隱含的系統依附元件。
- 使用遠端執行規則找出並修正密封性問題。
- 啟用嚴格沙箱機制 計算成效,因為建構作業中的動作可能是有狀態的,且會影響 建構或輸出內容
- 工作區規則可讓開發人員將依附元件新增至外部工作區,但這些規則的功能相當豐富,可讓程序中執行任意處理作業。你可以
以便取得 Bazel 工作區規則中某些可能非密封的動作記錄,
新增標記
--experimental_workspace_rules_log_file=PATH
到 執行 Bazel 指令
可搭配 Bazel 使用
進一步瞭解其他專案如何藉由密封而獲得成功 請使用 Bazel 進行建構,請查看以下 BazelCon 討論:
- 使用 Bazel 建構即時系統 (SpaceX)
- Bazel Remote Execution 和遠端快取 (Uber 和 TwoSigma)
- 透過遠端執行和快取加快建構速度
- 融合 Bazel:加快漸進式建構作業的速度
- 遠端執行作業與本機執行作業
- 改善遠端快取的可用性 (IBM)
- 使用 Bazel 建構自動駕駛汽車 (BMW)
- 使用 Bazel 建構自動駕駛車 + 問答 (GM Cruise)