額外資訊總覽

回報問題 查看原始碼 Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

本頁面說明如何使用巨集和規則擴充 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 會盡可能聰明地運作:使用相依關係分析來瞭解必須載入哪些檔案、必須分析哪些規則,以及必須執行哪些動作。舉例來說,如果規則產生的動作對目前建構作業來說並非必要,就不會執行。

建立額外資訊

編寫自己的擴充功能時,下方的兩個連結會非常實用。請將這些項目放在手邊:

進一步

除了巨集規則外,您可能還想編寫切面存放區規則