本頁面說明如何使用巨集和規則擴充 BUILD 語言。
Bazel 副檔名是結尾為 .bzl
的檔案。使用載入陳述式,從擴充功能匯入符號。
在學習更進階的概念之前,請先:
請參閱 Starlark 語言相關資訊,這項語言同時用於
BUILD
和.bzl
檔案。瞭解如何在兩個
BUILD
檔案之間共用變數。
巨集和規則
巨集是用來例項化規則的函式。巨集有兩種版本:符號巨集 (Bazel 8 的新功能) 和舊版巨集。這兩種巨集的定義方式不同,但從使用者角度來看,兩者的行為幾乎相同。當 BUILD
檔案過於重複或複雜時,巨集就會派上用場,因為它可讓您重複使用部分程式碼。只要讀取 BUILD
檔案,系統就會評估函式。評估 BUILD
檔案後,Bazel 幾乎沒有關於巨集的資訊。如果巨集會產生 genrule
,Bazel 的行為「幾乎」會與您在 BUILD
檔案中宣告 genrule
時相同。(唯一的例外狀況是,在符號巨集中宣告的目標具有特殊可見性語義:符號巨集可隱藏其內部目標,不讓其他套件看到)。
規則比巨集更強大。它可以存取 Bazel 內部資料,並完全控管正在進行的作業。例如,它可能會將資訊傳遞給其他規則。
如果您想重複使用簡單的邏輯,請先從巨集開始;除非您需要支援較舊的 Bazel 版本,否則建議您使用符號巨集。如果巨集變得複雜,通常建議將其設為規則。支援新語言通常是透過規則完成。規則適用於進階使用者,但大多數使用者不需要編寫規則,只需載入及呼叫現有規則即可。
評估模型
建構作業包含三個階段。
載入階段:首先,請載入並評估建構所需的所有擴充功能和
BUILD
檔案。執行BUILD
檔案時,只會將規則例項化 (每次呼叫規則時,就會將其新增至圖表)。這就是評估巨集的地方。分析階段:系統會執行規則的程式碼 (其
implementation
函式),並將動作例項化。動作會說明如何從一組輸入內容產生一組輸出內容,例如「在 hello.c 上執行 gcc 並取得 hello.o」。您必須在執行實際指令前,明確列出要產生的檔案。換句話說,分析階段會採用載入階段產生的圖表,並產生動作圖表。執行階段:當至少需要一個動作的輸出內容時,系統就會執行該動作。如果缺少檔案,或是指令無法產生輸出內容,則建構作業會失敗。這個階段也會執行測試。
Bazel 會使用平行處理功能讀取、剖析及評估 .bzl
檔案和 BUILD
檔案。每個建構作業最多會讀取一次檔案,且評估結果會快取並重複使用。檔案必須先解決所有依附元件 (load()
陳述式),才能進行評估。根據設計,載入 .bzl
檔案不會有明顯的副作用,只會定義值和函式。
Bazel 會盡量聰明地運作:使用相依關係分析來瞭解必須載入哪些檔案、必須分析哪些規則,以及必須執行哪些動作。舉例來說,如果規則產生的動作對目前建構作業來說並非必要,就不會執行。
建立額外資訊
建立第一個巨集,以便重複使用部分程式碼。接著,進一步瞭解巨集,並使用巨集建立「自訂動詞」。
以下兩個連結在編寫擴充功能時非常實用。請將這些項目放在手邊: