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