透過指令碼呼叫 Bazel

您可以從指令碼呼叫 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 內部使用,

  • 41-44 - 保留給 Google 內部使用,

  • 45 - 將結果發布至建構事件服務時發生錯誤。

  • 47 - 保留給 Google 內部使用,

傳回 bazel build 指令的代碼,bazel 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 (控制是否要列印「Build up-date」(建構的最新) 訊息);系統會剖析這些訊息,以找出成功建構的目標,以及其建立的輸出檔案位置。如果您使用這些訊息,請務必指定極大的 n 值。

透過剖析功能排解效能問題

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