額外資訊總覽

回報問題 查看來源

本頁說明如何使用巨集和規則擴充 BUILD 語言。

Bazel 副檔名是結尾為 .bzl 的檔案。使用載入陳述式從擴充功能匯入符號。

學習更多進階概念前,請先:

巨集和規則

巨集是執行個體化規則的函式,當 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 會使用依附元件分析來瞭解哪些檔案必須載入、必須分析哪些規則,以及必須執行哪些動作。舉例來說,如果規則產生的動作不適用於目前建構作業,系統就不會執行這些動作。

建立擴充功能

撰寫自己的擴充功能時,請點選下列兩個連結。讓玩家輕鬆聯繫:

更進一步

除了巨集規則之外,建議您編寫規格存放區規則