本頁說明如何使用巨集擴充 BUILD 語言 和規則
Bazel 擴充功能是結尾為 .bzl
的檔案。使用載入陳述式,從擴充功能匯入符號。
學習更進階的概念之前,請先:
請參閱《Starlark 語言》;
BUILD
和.bzl
檔案。瞭解如何在兩個
BUILD
檔案之間共用變數。
巨集和規則
巨集是一種可將規則例項化的函式。非常有用
有 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 會嘗試取巧:運用依附性分析來瞭解哪些檔案必須 、必須分析哪些規則,以及必須執行的動作。適用對象 舉例來說,如果規則會產生目前版本不需要的動作 並不會執行
建立擴充功能
建立第一個巨集,以便重複使用部分程式碼。接著,進一步瞭解巨集,並使用巨集建立「自訂動詞」。
編寫自己的擴充功能時,下方的兩個連結會非常實用。請將裝置放在手可及的範圍內: