前幾節抽象地說明瞭套件、目標和標籤,以及建構依附元件圖表。本節說明用於定義套件的具體語法。
根據定義,每個套件都包含 BUILD
檔案,這是簡短的程式。
BUILD
檔案會使用命令式語言 Starlark 進行評估。
系統會將這些項目解讀為一連串的陳述式。
一般來說,順序很重要:變數必須先定義才能使用。不過,大多數 BUILD
檔案只包含建構規則的宣告,這些陳述式的相對順序並不重要;重要的是在套件評估完成時,哪些規則已宣告,以及這些規則的值。
執行建構規則函式 (例如 cc_library
) 時,系統會在圖表中建立新目標。之後可以使用標籤參照這個目標。
在簡單的 BUILD
檔案中,規則宣告可以隨意重新排序,不會改變行為。
為鼓勵程式碼與資料清楚分離,BUILD
檔案不得包含函式定義、for
陳述式或 if
陳述式 (但允許清單理解和 if
運算式)。函式可改為在 .bzl
檔案中宣告。此外,*args
和 **kwargs
引數不得出現在 BUILD
檔案中,請改為明確列出所有引數。
重要的一點是,Starlark 中的程式無法執行任意 I/O。這項不變量可確保 BUILD
檔案的解譯作業是密封的,只會依據一組已知的輸入內容,這對於確保建構作業可重現至關重要。詳情請參閱「Hermeticity」。
BUILD
檔案應只使用 ASCII 字元編寫,但從技術上來說,系統會使用 Latin-1 字元集解讀這些檔案。
由於基礎程式碼的依附元件變更時,BUILD
檔案也需要更新,因此通常由團隊中的多人維護。BUILD
檔案作者應盡量加上註解,說明每個建構目標的角色、是否供大眾使用,以及套件本身的角色。
載入擴充功能
Bazel 擴充功能是以 .bzl
結尾的檔案。使用 load
陳述式從擴充功能匯入符號。
load("//foo/bar:file.bzl", "some_library")
這段程式碼會載入 foo/bar/file.bzl
檔案,並將 some_library
符號新增至環境。這項功能可用於載入新規則、函式或常數 (例如字串或清單)。如要匯入多個符號,請在呼叫 load
時使用額外引數。引數必須是字串常值 (無變數),且 load
陳述式必須出現在頂層,不能位於函式主體中。
load
的第一個引數是識別 .bzl
檔案的標籤。如果是相對標籤,則會根據包含目前 bzl
檔案的套件 (而非目錄) 解析。load
陳述式中的相對標籤應使用開頭的 :
。
load
也支援別名,因此您可以為匯入的符號指派不同名稱。
load("//foo/bar:file.bzl", library_alias = "some_library")
您可以在一個 load
陳述式中定義多個別名。此外,引數清單可以同時包含別名和一般符號名稱。以下範例完全合法 (請注意引號的使用時機)。
load(":my_rules.bzl", "some_rule", nice_alias = "some_other_rule")
在 .bzl
檔案中,以 _
開頭的符號不會匯出,也無法從其他檔案載入。
您可以使用載入瀏覽權限,限制可載入 .bzl
檔案的使用者。
建構規則類型
大多數建構規則都屬於系列,並依語言分組。舉例來說,cc_binary
、cc_library
和 cc_test
分別是 C++ 二進位檔、程式庫和測試的建構規則。其他語言使用相同的命名配置,但前置字元不同,例如 Java 的前置字元為 java_*
。部分函式已記錄在「建構百科全書」中,但任何人都可以建立新規則。
*_binary
規則會以指定語言建構可執行的程式。建構完成後,可執行檔會位於建構工具的二進位輸出樹狀結構中,並以規則標籤的對應名稱命名,因此//my:program
會出現在 (例如)$(BINDIR)/my/program
。在某些語言中,這類規則也會建立 runfiles 目錄,其中包含規則的
data
屬性中提及的所有檔案,或是依附元件的遞移封閉中任何規則的檔案;這組檔案會集中在一個位置,方便部署至正式環境。*_test
規則是*_binary
規則的特化版本,用於自動測試。測試只是在成功時傳回零的程式。與二進位檔一樣,測試也有執行檔樹狀結構,且測試在執行階段只能合法開啟其中的檔案。舉例來說,程式
cc_test(name='x', data=['//foo:bar'])
可能會在執行期間開啟及讀取$TEST_SRCDIR/workspace/foo/bar
。(每種程式設計語言都有自己的公用程式函式,可存取$TEST_SRCDIR
的值,但這些函式都等同於直接使用環境變數)。如未遵守這項規則,在遠端測試主機上執行測試時,測試就會失敗。*_library
規則會指定以特定程式設計語言個別編譯的模組。程式庫可以依附其他程式庫,二進位檔和測試則可以依附程式庫,並具有預期的個別編譯行為。
標籤 | 依附元件 |