常見問題

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

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

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

  • 如果你要的檔案含有標籤,可以直接要求其:bazel build //pkg:myfile.txt

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

  • 如果希望系統在每次指令列中提及您的目標時自動建構檔案,請傳回 DefaultInfo 提供者,以便將其新增至規則的預設輸出內容。

詳情請參閱規則頁面

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

Bazel 只會分析建構作業所要求的目標。您必須在指令列中為目標命名,或是根據目標命名。

執行我的動作或二進位檔時遺失檔案

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

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

針對二進位檔 (由 bazel runbazel test 指令執行的可執行輸出),您可以在執行檔案中加入輸入內容來宣告輸入內容。不要使用 path 欄位,而是改用 File.short_path,也就是與執行二進位檔的執行檔案目錄相對的檔案路徑。

如何控管 bazel build //pkg:mytarget 要建立的檔案?

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

如何在建構作業中執行程式或提交 I/O 檔案?

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

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

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

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

如何記錄 Starlark 程式碼?

針對規則和規則屬性,您可以將文件字串常值 (可能加上三引號) 傳送至 ruleattr.*()doc 參數。如需輔助函式和巨集,請按照這裡的格式,使用加上三引號的 docstring 常值。規則實作函式通常不需要專屬的 docstring。

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