以下是撰寫擴充功能時的常見問題和問題。
為什麼我的檔案無法產生 / 我的操作從未執行?
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
指令執行的可執行輸出內容),如要宣告輸入,請將輸入檔案納入執行檔案中。與其使用 path
欄位,請改用 File.short_path
,這是與二進位檔執行所在執行檔案目錄的相對檔案路徑。
如何控管 bazel build //pkg:mytarget
建立的檔案?
請使用 DefaultInfo
供應商來設定預設輸出內容。
如何在建構過程中執行程式或檔案 I/O?
與建構作業的任何其他部分一樣,工具可宣告為目標,並在執行階段中執行,以協助建構其他目標。如要建立執行工具的動作,請使用 ctx.actions.run
,並在工具中傳入 executable
參數。
在載入和分析階段,工具「無法」執行,也無法執行檔案 I/O。這表示工具和檔案內容 (BUILD 和 .bzl 檔案的內容除外) 不會影響目標與動作圖的建立方式。
如果在執行階段之前和期間需要存取相同的結構化資料,該怎麼辦?
您可以使用 .bzl 檔案格式設定結構化資料。您可以 load()
檔案,在載入和分析階段期間存取該檔案。您可以將其做為輸入或執行檔傳送至執行階段中需要該檔案或執行檔的動作和執行檔。
如何記錄 Starlark 程式碼?
如果是規則和規則屬性,您可以將 docstring 常值 (可能加上三引號標示) 傳遞至 rule
或 attr.*()
的 doc
參數。如需輔助函式和巨集,請依這裡的格式使用三加引號的 docstring 常值。規則實作函式通常不需要自己的 docstring。
在預期的位置使用字串常值,可讓自動化工具更容易擷取文件。您可以自由使用標準非字串註解,任何可能有助於讀取程式碼的使用者。