您可以從指令碼呼叫 Bazel,以執行建構、測試或查詢依附元件圖表。Bazel 是專為啟用有效的指令碼而設計,但本節列出一些細節,以利指令碼更完善運作。
選擇輸出基準
--output_base
選項可控制 Bazel 程序將建構的輸出內容寫入何處,以及 Bazel 內部使用的各種工作檔案。其中一個鎖定方式是鎖定 Bazel 程序,避免輸出集的並行異動。
為指令碼選擇正確的輸出基本目錄取決於多項因素。如果需要將建構輸出內容存放在特定位置,就會決定您需要使用的輸出基礎。如果您對 Bazel (例如 bazel query
) 發出「唯讀」呼叫,鎖定因素對您來說比較重要。請特別注意,如果需要同時執行多個指令碼執行個體,您需要為每個指令碼提供不同的 (或隨機) 輸出基礎。
如果您使用預設的輸出基礎值,就會繼續進行使用者互動式 Bazel 指令使用的鎖定。如果使用者發出長時間執行的指令,則指令碼必須等待這些指令執行完畢之後,才能繼續執行指令。
伺服器模式註意事項
根據預設,Bazel 會使用長時間執行的「伺服器程序」做為最佳化。在指令碼中執行 Bazel 時,別忘了在伺服器完成後呼叫 shutdown
,或是指定 --max_idle_secs=5
,讓閒置伺服器立即關閉。
我會收到哪個結束代碼?
Bazel 會嘗試區別因原始碼而失敗的原始碼與會導致 Bazel 正常執行的外部錯誤。Bazel 執行作業可能會導致下列結束代碼:
結束代碼適用於所有指令:
0
- 成功2
- 指令列問題、錯誤或非法的旗標或指令組合,或錯誤的環境變數。您必須修改指令列。8
- 建構中斷,但我們已實際終止服務。9
- 保留伺服器鎖定,且通過了--noblock_for_lock
。32
- 這部機器上沒有外部環境發生錯誤。33
- Bazel 記憶體不足,因此當機。您必須修改指令列。34
- 僅供 Google 內部使用。35
- 僅供 Google 內部使用。36
- 地方環境問題,疑似永久存在。37
- 無法處理的例外狀況 / 內部 Bazel 錯誤。38
- 僅供 Google 內部使用。39
:系統會從遠端快取中移除 Bazel 所需的 Blob。41-44
- 僅供 Google 內部使用。45
:將結果發布至建構事件服務時發生錯誤。47
- 僅供 Google 內部使用。
傳回指令 bazel build
、bazel test
的代碼:
1
- 建構失敗。3
- 建構順利,但部分測試失敗或逾時。4
:建構成功,但即使收到了測試要求,也找不到任何測試。
bazel run
:
1
- 建構失敗。- 如果建構成功,但執行的子程序會傳回非零的結束代碼,則也會是指令的結束代碼。
bazel query
:
3
- 部分成功,但查詢在輸入的 BUILD 檔案集中發生 1 或多個錯誤,因此作業結果並非 100% 可靠。原因可能是指令列上的--keep_going
選項。7
- 指令失敗。
日後的 Bazel 版本可能會新增其他結束代碼,將一般的故障結束代碼 1
替換為其他非零值,並具有特定意義。不過,所有非零的離開值一律都會構成錯誤。
讀取 .bazelrc 檔案
根據預設,Bazel 會從基本工作區目錄或使用者主目錄中讀取 .bazelrc
檔案。無論您是否該選擇指令碼,只要您的指令碼必須完全符合移植者 (例如執行發布子版本時),都應使用 --bazelrc=/dev/null
選項停用讀取 .bazelrc 檔案的功能。如果您想以使用者的偏好設定執行建構作業,建議採用預設行為。
指令記錄
您也可以使用下列指令,在指令記錄檔中找到 Bazel 輸出:
bazel info command_log
指令記錄檔包含最新 Bazel 指令的交錯 stdout 和 stderr 串流。請注意,執行 bazel info
將覆寫這個檔案的內容,因為該檔案會變成最新的 Bazel 指令。但是,除非您變更 --output_base
或 --output_user_root
選項的設定,否則指令記錄檔的位置不會改變。
剖析輸出內容
Bazel 輸出內容很容易剖析,以因應多種用途。對指令碼而言,兩個選項可能很實用:--noshow_progress
會隱藏進度訊息;而 --show_result n
則控制是否列印「建構最新」訊息;系統可能會剖析這些訊息,以探索成功建構的目標和輸出檔案的位置。如果您需要這些訊息,請務必指定非常大的 n 值。
分析效能疑難排解
請參閱「效能分析」一節。