本節定義許多函式或建構規則通用的各種詞彙和概念。
目錄
- Bourne Shell 權杖化
- 標籤擴充
- 大多數建構規則定義的典型屬性
- 所有建構規則通用的屬性
- 所有測試規則共用的屬性 (*_test)
- 所有二進位規則共用的屬性 (*_binary)
- 可設定的屬性
- 隱含輸出目標
Bourne Shell 權杖化
根據 Bourne Shell 的權杖化規則,部分規則的特定字串屬性會分割成多個字詞:未加引號的空格會分隔字詞,單引號、雙引號和反斜線字元則會防止權杖化。
凡是會經過權杖化的屬性,都會在本文件的定義中明確指出。
受「Make」變數擴充和 Bourne Shell 權杖化影響的屬性,通常用於將任意選項傳遞至編譯器和其他工具。這類屬性的例子包括 cc_library.copts
和 java_library.javacopts
。這些替代項目可讓單一字串變數擴展為特定設定的選項字詞清單。
標籤擴展
極少數規則的某些字串屬性會受到標籤擴展影響:如果這些字串包含有效標籤做為子字串 (例如 //mypkg:target
),且該標籤是目前規則的已宣告必要條件,則會擴展為 target
//mypkg:target
所代表檔案的路徑名稱。
例如 genrule.cmd
和 cc_binary.linkopts
。在每個案例中,詳細資料可能會有顯著差異,例如相對標籤是否會展開、展開為多個檔案的標籤如何處理等。如需具體細節,請參閱規則屬性說明文件。
大多數建構規則定義的典型屬性
本節說明許多 (但並非所有) 建構規則定義的屬性。
屬性 | 說明 |
---|---|
data |
標籤清單;預設值為 這項規則在執行階段所需的檔案。可能會列出檔案或規則目標。一般來說,允許任何目標。
如果新規則會處理可能在執行階段使用其他輸入內容的輸入內容,就應定義 |
deps |
標籤清單;預設值為
這個目標的依附元件。一般來說,只應列出規則目標。(雖然部分規則允許直接在 一般來說,語言專屬規則會將列出的目標限制為具有特定供應商的目標。
目標依附於另一個目標的確切語意 (使用
在大多數情況下, |
licenses |
字串清單;無法設定;
預設為 用於這個特定目標的授權類型字串清單。 這是已淘汰授權 API 的一部分,Bazel 不再使用此 API。請勿使用這個。 |
srcs |
標籤清單;預設值為
這項規則處理或納入的檔案。一般會直接列出檔案,但可能會列出規則目標 (例如 語言專屬規則通常會要求列出的檔案具有特定副檔名。 |
所有建構規則通用的屬性
本節說明隱含新增至所有建構規則的屬性。
屬性 | 說明 |
---|---|
aspect_hints |
標籤清單;預設值為 任意標籤清單,會公開給層面 (特別是這個規則的反向依附元件所叫用的層面),但不會公開給這個規則本身的實作項目。如要瞭解特定長寬比提示的效果,請參閱語言專屬規則集的說明文件。 您可以將方面提示視為 標記的進階替代方案:
標記只會傳達布林狀態 (標記存在於 在實務上,層面提示用於不同語言專屬規則集之間的互通性。舉例來說,假設您有一個 如需具體範例,請參閱 最佳做法:
|
compatible_with |
這個目標可建構的環境清單,以及預設支援的環境。 這是 Bazel 限制系統的一部分,可讓使用者宣告哪些目標可以互相依附,哪些則不行。舉例來說,可從外部部署的二進位檔不應依附於含有公司機密程式碼的程式庫。詳情請參閱「 ConstraintSemantics」。 |
deprecation |
字串;不可設定;預設值為 與這個目標相關的說明警告訊息。 通常用於通知使用者目標已過時、已被其他規則取代、屬於套件的私有目標,或可能因某種原因被視為有害。建議您加入一些參考資料 (例如網頁、錯誤編號或遷移 CL 範例),方便使用者輕鬆找出避免顯示訊息所需的變更。如果有新的目標可做為替代方案,建議直接遷移舊目標的所有使用者。
這個屬性不會影響建構方式,但可能會影響建構工具的診斷輸出內容。如果其他套件中的目標依附於具有 套件內依附元件可免除這項警告,因此舉例來說,建構已淘汰規則的測試時,不會遇到警告。 如果已淘汰的目標依附於另一個已淘汰的目標,系統不會發出警告訊息。 使用者停止使用後,即可移除目標。 |
exec_compatible_with |
|
exec_group_compatible_with |
字串字典,對應至 labels 清單;
nonconfigurable;預設為
執行群組名稱的字典,對應至特定執行群組的執行平台中必須存在的 |
exec_properties |
字串字典,預設為 字串字典,會新增至這個目標所選平台的 如果平台和目標層級屬性都有鍵,系統會採用目標的值。 鍵可以加上執行群組的名稱做為前置字元,後面加上 |
features |
功能字串清單;預設值為 功能是字串標記,可在目標上啟用或停用。特徵的意義取決於規則本身。 這項 |
package_metadata |
標籤清單;
不可設定;預設值為套件的
與這個目標相關聯的中繼資料標籤清單。 通常標籤是簡單的規則,會傳回常數值的供應商。規則和層面可能會使用這些標籤,對建構圖表執行一些額外分析。
標準用途是 rules_license。在該用途中, |
restricted_to |
這個目標可建構的環境清單,而非預設支援的環境。
這是 Bazel 限制系統的一部分。詳情請參閱 |
tags |
字串清單;無法設定;
預設為
任何規則都可以使用標記。測試和標記
如果 Bazel 在任何測試或
測試的標記通常用於註解測試在偵錯和發布程序中的角色。一般來說,標記最適合用於 C++ 和 Python 測試,因為這類測試缺少任何執行階段註解功能。使用標記和大小元素,可根據程式碼庫簽入政策,彈性組裝測試套件。
如果 Bazel 在測試規則的
|
target_compatible_with |
標籤清單;預設值為
如果目標遞移依附於不相容的目標,該目標本身也會被視為不相容。建構和測試時也會略過這些檔案。 空白清單 (預設值) 表示目標與所有平台相容。
除了工作區規則以外,所有規則都支援這項屬性。部分規則不受這項屬性影響。舉例來說,為
如要進一步瞭解不相容的目標略過功能,請參閱「平台」頁面。 |
testonly |
布林值;不可設定;預設值為
如果
同樣地,不是
測試 ( 這個屬性表示目標不應包含在發布至正式版的二進位檔中。 由於 testonly 是在建構時 (而非執行階段) 強制執行,且會透過依附元件樹狀結構快速傳播,因此應謹慎套用。舉例來說,適用於單元測試的存根和模擬物件,可能也適用於涉及相同二進位檔的整合測試 (這些二進位檔會發布至實際工作環境),因此可能不應標示為 testonly。反之,如果規則連連結都很危險 (可能是因為會無條件覆寫正常行為),就絕對應該標示為 testonly。 |
toolchains |
允許這個目標存取「建立變數」的目標集。這些目標可以是提供
請注意,這與規則實作項目用於平台專屬設定的工具鍊解析概念不同。您無法使用這項屬性,判斷目標會使用哪個特定 |
visibility |
如果是直接在 BUILD 檔案中宣告的目標,或是從 BUILD 檔案呼叫的舊版巨集,預設值為套件的 |
所有測試規則 (*_test) 的通用屬性
本節說明所有測試規則通用的屬性。
屬性 | 說明 | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
args |
字串清單;須遵守 $(location) 和「建立變數」替代,以及 Bourne Shell 權杖化;預設為 Bazel 在使用
這些引數會先傳遞,再傳遞 |
||||||||||||||||||||
env |
字串字典;值須符合 $(location) 和「Make variable」(建立變數) 替代項目;預設值為
指定在
這項屬性僅適用於原生規則,例如 |
||||||||||||||||||||
env_inherit |
字串清單;預設值為 指定在
這項屬性僅適用於原生規則,例如 |
||||||||||||||||||||
size |
字串 指定測試目標的「重量」:執行測試需要多少時間/資源。 單元測試屬於「小型」,整合測試屬於「中型」,端對端測試則屬於「大型」或「巨大」。Bazel 會使用大小判斷預設逾時時間,但可使用 測試大小對應的預設逾時和假設的本機資源用量尖峰如下:
在衍生測試時,環境變數 |
||||||||||||||||||||
timeout |
字串 預計測試執行多久後會傳回結果。
測試的 size 屬性會控管資源預估,但測試的逾時時間可以獨立設定。如果未明確指定,逾時時間會根據測試大小而定。您可以使用
如需其他時間,可以使用
產生測試時,環境變數 |
||||||||||||||||||||
flaky |
布林值;無法設定;
預設值為 將測試標示為不穩定。 如果設定此選項,系統最多會執行三次測試,只有在每次測試都失敗時,才會將測試標示為失敗。根據預設,這項屬性會設為 False,且測試只會執行一次。請注意,一般不建議使用這項屬性,因為測試應在斷言成立時可靠地通過。 |
||||||||||||||||||||
shard_count |
小於或等於 50 的非負整數;預設值為 指定要用於執行測試的平行分片數量。 如果設定這個值,系統會覆寫所有用來判斷平行資料分割數量的啟發式方法,並以這個值執行測試。請注意,部分測試規則可能需要這個參數,才能啟用分片。另請參閱 如果啟用測試分片,系統會在產生測試時,將環境變數 資料分割需要測試執行器支援測試資料分割通訊協定。 如果沒有,系統很可能會在每個分片中執行所有測試,這並非您所要的結果。 如要瞭解分片作業的詳細資訊,請參閱測試百科全書中的「測試分片」。 |
||||||||||||||||||||
local |
布林值;無法設定;
預設值為 強制在本機執行測試,不使用沙箱。 將此值設為 True,相當於提供「local」做為標記 ( |
所有二進位規則 (*_binary) 的通用屬性
本節說明所有二進位規則通用的屬性。
屬性 | 說明 |
---|---|
args |
字串清單;須遵守 $(location) 和「Make variable」(建立變數) 替代項目,以及 Bourne shell 權杖化;無法設定;預設為
Bazel 在透過
注意:在 Bazel 以外執行目標時 (例如手動執行 |
env |
字串字典;值須符合 $(location) 和「Make variable」(建立變數) 替代項目;預設值為 指定目標由
這項屬性僅適用於原生規則,例如
注意:在 Bazel 以外執行目標時 (例如手動執行 |
output_licenses |
字串清單;預設值為 這個二進位檔產生的輸出檔案授權。 這是已淘汰授權 API 的一部分,Bazel 不再使用此 API。請勿使用這個。 |
可設定的屬性
大多數屬性都是「可設定」,也就是說,目標的建構方式不同,屬性值也可能隨之變更。具體來說,可設定的屬性可能會因傳遞至 Bazel 指令列的旗標,或下游依附元件要求目標的內容而異。舉例來說,這可用於自訂多個平台或編譯模式的目標。
以下範例會為不同的目標架構宣告不同的來源。執行 bazel build :multiplatform_lib --cpu x86
會使用 x86_impl.cc
建構目標,而取代 --cpu arm
則會導致目標改用 arm_impl.cc
。
cc_library( name = "multiplatform_lib", srcs = select({ ":x86_mode": ["x86_impl.cc"], ":arm_mode": ["arm_impl.cc"] }) ) config_setting( name = "x86_mode", values = { "cpu": "x86" } ) config_setting( name = "arm_mode", values = { "cpu": "arm" } )
select()
函式會根據目標設定符合的 config_setting
或 constraint_value
條件,為可設定的屬性選擇不同的替代值。
Bazel 會在處理巨集後和處理規則前評估可設定的屬性 (技術上,是在
載入和分析階段之間)。select()
評估前的任何處理程序,都不知道 select()
會選擇哪個分支。舉例來說,巨集無法根據所選分支機構變更行為,而 bazel query
只能保守地猜測目標的可設定依附元件。如要進一步瞭解如何搭配規則和巨集使用 select()
,請參閱
常見問題。
說明文件中標示 nonconfigurable
的屬性無法使用這項功能。通常屬性無法設定,是因為 Bazel 內部需要知道屬性的值,才能判斷如何解析 select()
。
如需詳細總覽,請參閱「 可設定的建構屬性」。
隱含輸出目標
C++ 中的隱含輸出已淘汰。請盡可能避免使用其他語言。我們尚未制定淘汰路徑,但最終也會淘汰這些 API。
在 BUILD 檔案中定義建構規則時,您會在套件中明確宣告新的具名規則目標。許多建構規則函式也隱含一或多個輸出檔案目標,其內容和意義取決於規則。
舉例來說,當您明確宣告 java_binary(name='foo', ...)
規則時,也會隱含宣告輸出檔案目標 foo_deploy.jar
為同一套件的成員。(這個特定目標是適合部署的獨立 Java 封存檔)。
隱含輸出目標是全域目標圖的第一級成員。與其他目標一樣,這些目標是依需求建構,無論是在頂層建構指令中指定,或是其他建構目標的必要先決條件,都是如此。這些目標可在 BUILD 檔案中做為依附元件參照,並在 bazel query
等分析工具的輸出內容中觀察到。
每種建構規則的說明文件都包含一個特別章節,詳細說明宣告該類規則所隱含的輸出內容名稱和內容。
建構系統使用的兩個命名空間之間,存在重要但有些細微的差異:標籤會識別目標,目標可能是規則或檔案,而檔案目標可分為來源 (或輸入) 檔案目標和衍生 (或輸出) 檔案目標。您可以在 BUILD 檔案中提及這些項目、從指令列建構,或使用 bazel query
檢查;這是目標命名空間。每個檔案目標都對應至磁碟上的一個實際檔案 (「檔案系統命名空間」);每個規則目標可能對應至磁碟上的零個、一個或多個實際檔案。磁碟上可能會有沒有對應目標的檔案;舉例來說,從 BUILD 檔案或指令列中,無法參照 C++ 編譯期間產生的 .o
物件檔案。這樣一來,建構工具可能會隱藏其工作方式的特定實作細節。詳情請參閱「BUILD 概念參考資料」。