以下是書寫擴充功能的常見問題。
為什麼我的檔案未產生 / 我的動作從未執行?
Bazel 只會執行產生要求的輸出檔案所需的動作。
如果所需檔案已套用標籤,您可以直接要求該檔案:
bazel build //pkg:myfile.txt
如果檔案位於目標的輸出群組中,您可能需要在指令列上指定該輸出群組:
bazel build //pkg:mytarget --output_groups=foo
如果您希望在指令列提及目標時自動建構檔案,請傳回
DefaultInfo
提供者,將檔案新增至規則的預設輸出內容。
詳情請參閱「規則」頁面。
為什麼我的實作函式未執行?
Bazel 只會分析建構作業要求的目標。您應該在指令列中指定目標,或是依目標命名。
執行動作或二進位檔時缺少檔案
請確認 1) 檔案已註冊為動作或二進位檔的輸入內容,以及 2) 執行中的指令碼或工具是使用正確的路徑存取檔案。
針對動作,您可以將輸入內容傳遞至建立動作的 ctx.actions.*
函式,藉此宣告輸入內容。您可以使用 File.path
取得檔案的正確路徑。
對於二進位檔 (由 bazel run
或 bazel 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 字面值 (可能使用三重引號) 傳遞至 rule
或 attr.*()
的 doc
參數。如要使用輔助函式和巨集,請使用三重引號 docstring 字面值,並遵循這裡提供的格式。規則實作函式通常不需要自己的 docstring。
在預期的位置使用字串文字,可讓自動化工具更輕鬆地擷取文件。您可以隨意使用標準的非字串註解,協助讀者瞭解程式碼。