本頁說明如何使用巨集和規則擴充 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 會盡量聰明地運作:它會使用依附元件分析,瞭解必須載入哪些檔案、必須分析哪些規則,以及必須執行哪些動作。舉例來說,如果規則產生目前建構作業不需要的動作,系統就不會執行這些動作。
建立擴充功能
建立第一個巨集,以便重複使用部分程式碼。 然後進一步瞭解巨集,以及如何使用巨集建立「自訂動詞」。
撰寫擴充功能時,以下兩個連結會很有幫助。隨手可得: