以下是撰寫擴充功能時的常見問題。
為什麼系統沒有產生檔案 / 執行動作?
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()
檔案,以便存取。您可以在執行階段,將其做為動作和可執行檔的輸入內容或 runfile 傳遞。
如何記錄 Starlark 程式碼?
如要瞭解規則和規則屬性,您可以將文件字串常值 (可能以三引號括住) 傳遞至 rule
或 attr.*()
的 doc
參數。如要使用輔助函式和巨集,請使用三引號括住的 docstring 常值,並遵循這裡的格式。規則實作函式通常不需要自己的 docstring。
在預期位置使用字串文字,可讓自動化工具更輕鬆地擷取文件。您可以在任何有助於讀者瞭解程式碼的地方,使用標準的非字串註解。