以下是撰寫擴充功能的常見問題。
為什麼我的檔案未產生 / 從未執行動作?
Bazel 只會執行產生 requested 輸出檔案所需的動作。
如果你要的檔案含有標籤,可以直接要求其:
bazel build //pkg:myfile.txt
如果檔案位於目標的輸出群組中,您可能需要在指令列中指定該輸出群組:
bazel build //pkg:mytarget --output_groups=foo
如果希望系統在每次指令列中提及您的目標時自動建構檔案,請傳回
DefaultInfo
提供者,以便將其新增至規則的預設輸出內容。
詳情請參閱規則頁面。
為什麼我的實作函式無法執行?
Bazel 只會分析建構作業所要求的目標。您必須在指令列中為目標命名,或是根據目標命名。
執行我的動作或二進位檔時遺失檔案
請確認 1) 檔案已註冊為動作或二進位檔的輸入;以及 2) 執行的指令碼或工具正在使用正確的路徑存取檔案。
如要宣告輸入,請將輸入內容傳遞至建立動作的 ctx.actions.*
函式。您可以使用 File.path
取得檔案的正確路徑。
針對二進位檔 (由 bazel run
或 bazel test
指令執行的可執行輸出),您可以在執行檔案中加入輸入內容來宣告輸入內容。不要使用 path
欄位,而是改用 File.short_path
,也就是與執行二進位檔的執行檔案目錄相對的檔案路徑。
如何控管 bazel build //pkg:mytarget
要建立的檔案?
使用 DefaultInfo
提供者來設定預設輸出。
如何在建構作業中執行程式或提交 I/O 檔案?
您可將工具宣告為目標,就像您建構的任何其他部分一樣,並在執行階段中執行,以協助建構其他目標。如要建立執行工具的動作,請使用 ctx.actions.run
,並將工具做為 executable
參數傳入。
在載入和分析階段,工具「無法」執行,也無法執行檔案 I/O。這表示工具和檔案內容 (BUILD 和 .bzl 檔案的內容除外) 不會影響目標和動作圖表的建立方式。
如果我需要在執行階段前後存取相同的結構化資料,該怎麼辦?
你可以將結構化資料的格式設為 .bzl 檔案。您可以 load()
檔案,以便在載入和分析階段存取該檔案。您可以將其做為輸入內容或執行檔,傳遞至執行階段中需要此項目的動作和執行檔。
如何記錄 Starlark 程式碼?
針對規則和規則屬性,您可以將文件字串常值 (可能加上三引號) 傳送至 rule
或 attr.*()
的 doc
參數。如需輔助函式和巨集,請按照這裡的格式,使用加上三引號的 docstring 常值。規則實作函式通常不需要專屬的 docstring。
在預期位置使用字串常值,可讓自動化工具更輕鬆地擷取說明文件。您可以隨意使用標準非字串註解,在對程式碼讀取者有幫助的地方使用。