額外資訊總覽

回報問題 查看來源 Nightly · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

本頁說明如何使用巨集和規則擴充 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 會盡量聰明地運作:它會使用依附元件分析,瞭解必須載入哪些檔案、必須分析哪些規則,以及必須執行哪些動作。舉例來說,如果規則產生目前建構作業不需要的動作,系統就不會執行這些動作。

建立擴充功能

撰寫擴充功能時,以下兩個連結會很有幫助。隨手可得:

進階操作

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