額外資訊總覽

回報問題 查看來源

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

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

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

巨集和規則

巨集是一種可將規則例項化的函式。當 BUILD 檔案過於重複或過於複雜時,這個做法就很實用,可以讓您重複使用某些程式碼。系統會在讀取 BUILD 檔案後立即評估該函式。評估 BUILD 檔案後,Bazel 幾乎沒有巨集相關資訊:如果巨集產生 genrule,Bazel 的行為就會像您編寫 genrule 一樣。因此,bazel query 只會列出產生的 genrule

規則比巨集功能更強大。此工具可存取 Bazel 內部資料 並完全掌控當下情況例如將資訊傳遞至其他規則。

如要重複使用簡單的邏輯,請從巨集開始。如果巨集變得複雜,最好將巨集設定為規則。新語言的支援通常可透過規則完成規則適用於進階使用者,大部分的使用者都不需要撰寫規則,只會載入及呼叫現有規則。

評估模型

建構作業包含三個階段

  • 載入階段:首先,請載入並評估建構作業需要的所有擴充功能和所有 BUILD 檔案。BUILD 檔案的執行只會對規則執行例項化作業 (每次呼叫規則時,系統都會將規則新增至圖表)。這是評估巨集的位置。

  • 分析階段:系統會執行規則的程式碼 (其 implementation 函式),並將動作執行個體化。動作說明如何透過一組輸入產生一組輸出內容,例如「run gcc on hello.c and get hello.o」。您必須先明確列出將產生哪些檔案,再執行實際指令。換句話說,分析階段會使用載入階段產生的圖表,並產生動作圖表。

  • 執行階段:需要至少一項輸出內容時,系統就會執行動作。如果缺少檔案,或是指令無法產生一個輸出內容,建構作業就會失敗。測試也會在這個階段執行。

Bazel 會使用平行處理原則讀取、剖析及評估 .bzl 檔案和 BUILD 檔案。每個建構作業最多只會讀取檔案一次,系統也會快取並重複使用評估結果。解決檔案的所有依附元件 (load() 陳述式) 之後,系統才會評估檔案。設計時,載入 .bzl 檔案沒有任何可見的副作用,只會定義值和函式。

Bazel 會試著聰明地判斷哪些檔案必須載入、必須分析哪些規則,以及必須執行哪些動作。例如,如果規則產生目前建構不需要的動作,系統就不會執行這些動作。

建立擴充功能

以下兩個連結在您撰寫自己的額外資訊時相當實用。讓目標對像一目瞭然:

再升級

除了巨集規則之外,您可能會想撰寫規格存放區規則