透過指令碼呼叫 Bazel

回報問題 查看原始碼 Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

您可以從指令碼呼叫 Bazel,執行建構、測試或查詢相依關係圖。Bazel 的設計目的是讓您能有效編寫指令碼,但本節列出一些需要留意的細節,讓您的指令碼更健全。

選擇輸出基礎

--output_base 選項可控管 Bazel 程序應將建構作業的輸出內容寫入的位置,以及 Bazel 在內部使用的各種工作檔案,其中一個檔案是鎖定,可防止多個 Bazel 程序同時變更輸出基礎。

選擇正確的輸出基礎目錄,取決於多項因素。如果您需要將建構輸出內容放在特定位置,系統會根據這個位置決定您需要使用的輸出基礎。如果您向 Bazel 發出「只讀」呼叫 (例如 bazel query),鎖定因素就會更重要。特別是,如果您需要同時執行多個指令碼例項,請注意,每個 Blaze 伺服器程序最多只能處理一次一次的叫用。視情況而定,每個指令碼例項都可能需要等待輪到自己執行,或者您可能需要使用 --output_base 執行多個 Blaze 伺服器並加以使用。

如果您使用預設的輸出基礎值,就會繼續進行使用者互動式 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 - 將結果發布至建構事件服務時發生暫時性錯誤。

  • 39:系統會從遠端快取中移除 Bazel 所需的 Blob。

  • 41-44 - 保留供 Google 內部使用。

  • 45:將結果發布至建構事件服務時發生持續性錯誤。

  • 47 - 僅供 Google 內部使用。

  • 49 - 保留供 Google 內部使用。

指令 bazel buildbazel test 的傳回碼:

  • 1 - 建構失敗。
  • 3 - 建構作業成功,但部分測試失敗或逾時。
  • 4 - 建構作業成功,但即使要求測試,也找不到任何測試。

針對 bazel run

  • 1 - 建構失敗。
  • 如果建構作業成功,但執行的子程序傳回非零的結束代碼,則該代碼也會是指令的結束代碼。

針對 bazel query

  • 3 - 部分成功,但在輸入的 BUILD 檔案集中發生 1 個以上的錯誤,因此作業結果不一定可靠。這可能是因為指令列上的 --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 值。

分析效能疑難排解

請參閱「效能分析」一節。