常見問題

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

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

為什麼我的檔案未產生 / 我的動作從未執行?

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() 檔案,在載入和分析階段存取檔案。您可以將其做為輸入或執行檔,傳遞給在執行階段需要此檔案的動作和可執行檔。

我該如何為 Starlark 程式碼撰寫文件?

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

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