常見問題

回報問題 查看來源 Nightly · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

以下是撰寫擴充功能時的常見問題。

為什麼系統沒有產生檔案 / 執行動作?

Bazel 只會執行產生要求輸出檔案所需的動作。

  • 如果所需檔案有標籤,可以直接要求: bazel build //pkg:myfile.txt

  • 如果檔案位於目標的輸出群組中,您可能需要在指令列上指定該輸出群組: bazel build //pkg:mytarget --output_groups=foo

  • 如要讓系統在指令列上提及目標時自動建構檔案,請傳回 DefaultInfo 提供者,將檔案新增至規則的預設輸出內容。

詳情請參閱「規則」頁面

為什麼我的實作函式未執行?

Bazel 只會分析建構作業要求的目標。您應該在指令列中命名目標,或命名取決於目標的項目。

執行動作或二進位檔時缺少檔案

請確認 1) 檔案已註冊為動作或二進位檔的輸入內容,且 2) 執行的指令碼或工具正在使用正確路徑存取檔案。

如要宣告動作的輸入內容,請將這些內容傳遞至建立動作的 ctx.actions.* 函式。您可以使用 File.path 取得檔案的正確路徑。

如果是二進位檔 (由 bazel runbazel test 指令執行的可執行輸出內容),請將輸入內容納入 runfiles,藉此宣告輸入內容。請使用 File.short_path,而非 path 欄位。這是檔案相對於二進位檔執行所在 runfiles 目錄的路徑。

如何控管 bazel build //pkg:mytarget 要建構哪些檔案?

使用 DefaultInfo 提供者設定預設輸出

如何執行程式或進行檔案 I/O,做為建構程序的一部分?

工具可以宣告為目標,就像建構作業的其他部分一樣,並在執行階段執行,協助建構其他目標。如要建立執行工具的動作,請使用 ctx.actions.run,並將工具做為 executable 參數傳遞。

在載入和分析階段,工具無法執行,您也無法執行檔案 I/O。也就是說,工具和檔案內容 (BUILD 和 .bzl 檔案的內容除外) 無法影響目標和動作圖表的建立方式。

如果我需要在執行階段前後存取相同的結構化資料,該怎麼辦?

您可以將結構化資料格式化為 .bzl 檔案。您可以在載入和分析階段load()檔案,以便存取。您可以在執行階段,將其做為動作和可執行檔的輸入內容或 runfile 傳遞。

如何記錄 Starlark 程式碼?

如要瞭解規則和規則屬性,您可以將文件字串常值 (可能以三引號括住) 傳遞至 ruleattr.*()doc 參數。如要使用輔助函式和巨集,請使用三引號括住的 docstring 常值,並遵循這裡的格式。規則實作函式通常不需要自己的 docstring。

在預期位置使用字串文字,可讓自動化工具更輕鬆地擷取文件。您可以在任何有助於讀者瞭解程式碼的地方,使用標準的非字串註解。