原生

回報問題 查看來源

支援原生規則和其他套件輔助函式的內建模組。在這個模組中,所有原生規則都會以函式的形式顯示,例如 native.cc_library。請注意,原生模組只能在載入階段使用 (亦即用於巨集,不適用於規則導入)。屬性會忽略 None 值,並將其視為屬性未設定。
您也可以使用下列函式:

成員

existing_rule

unknown native.existing_rule(name)

傳回類似字典的不可變更物件,該物件會描述在這個執行緒套件中例項化的規則屬性;如果沒有任何該名稱的規則例項,則傳回 None

此處的「不可變的 dict 物件」是指深度不可變更的物件 x,支援類似 dict 的疊代、len(x)name in xx[name]x.get(name)x.items()x.keys()x.values()

如果設定了 --noincompatible_existing_rules_immutable_view 旗標,則會改為傳回含有相同內容的新可變動字典。

結果會包含每個屬性的項目,但私人屬性 (名稱開頭不是字母) 和一些無法代表的舊版屬性類型除外。此外,字典包含規則例項 namekind 的項目 (例如 'cc_binary')。

結果的值代表屬性值如下:

  • 類型 str、Int 和 bool 的屬性表示方式為 。
  • 對於同一套件中的目標,標籤會轉換為 ':foo' 格式的字串,對於不同套件中的目標,標籤會轉換為 '//pkg:name'
  • 清單會以元組表示,而字典會轉換成新的可變動字典。這些元素會以相同的方式遞迴轉換。
  • 如上所述,系統會一併轉換 select 值的內容轉換內容。
  • 建立規則例項時未指定任何值,且計算其預設值的屬性,不會納入結果。(分析階段才能計算計算的預設值)。

請盡量避免使用此函式。這會導致 BUILD 檔案簡單且依照順序排列。另請注意,規則屬性值從內部形式到 Starlark 的另外兩種轉換也與計算結果大不相同:系統會依計算預設值使用,另一個由 ctx.attr.foo 使用。

參數

參數 說明
name 必填
目標的名稱。

existing_rules

unknown native.existing_rules()

傳回類似字典的不可變更物件,描述此執行緒套件中目前執行個體化的規則。類似字典物件的每個項目,都會將規則執行個體的名稱對應至 existing_rule(name) 傳回的結果。

此處的「不可變的 dict 物件」是指深度不可變更的物件 x,支援類似 dict 的疊代、len(x)name in xx[name]x.get(name)x.items()x.keys()x.values()

如果設定了 --noincompatible_existing_rules_immutable_view 旗標,則會改為傳回含有相同內容的新可變動字典。

注意:請盡量避免使用這個函式。這會導致 BUILD 檔案簡單且依照順序排列。此外,如果設定了 --noincompatible_existing_rules_immutable_view 旗標,這個函式可能會非常高昂,尤其是在迴圈內呼叫時。

exports_files

None native.exports_files(srcs, visibility=None, licenses=None)

指定從這個套件匯出至其他套件的檔案清單。

參數

參數 說明
srcs 字串sequence;必要
要匯出的檔案清單。
visibility sequenceNone;預設值為 None
可指定瀏覽權限宣告。檔案可向指定目標顯示。如果沒有指定瀏覽權限,每個套件都能查看檔案。
licenses 字串sequenceNone;預設為 None
必須指定授權。

glob

sequence native.glob(include=[], exclude=[], exclude_directories=1, allow_empty=unbound)

Glob 會傳回目前套件中的每個檔案,且其可變動且經過排序:
  • 至少符合 include 中的一個模式。
  • 不符合 exclude 中的任何模式 (預設 [])。
如果啟用 exclude_directories 引數 (設為 1),結果中系統會省略類型目錄的檔案 (預設為 1)。

參數

參數 說明
include 字串序列;預設值為 []
要納入的 glob 模式清單。
exclude 字串序列;預設值為 []
要排除的 glob 模式清單。
exclude_directories 預設值為 1
用於排除目錄的標記。
allow_empty 預設值為 unbound
是否允許 glob 模式比對任何項目。如果「allow_empty」為 False,每個納入模式都必須相符,而最終結果也必須是空白的 (在排除「排除」模式的相符項目後)。

module_name

string native.module_name()

與這個套件的存放區相關聯的 Bazel 模組名稱。如果這個套件來自 WORKSPACE 中定義的存放區,而非 MODULE.bazel,則這個套件沒有任何內容。如為由模組擴充功能產生的存放區,這就是代管擴充功能的模組名稱。與 module_ctx.modules 中顯示的 module.name 欄位相同。可能會傳回 None

module_version

string native.module_version()

與這個套件的存放區相關聯的 Bazel 模組版本。如果這個套件來自 WORKSPACE 中定義的存放區,而非 MODULE.bazel,則這個套件沒有任何內容。針對由模組擴充功能產生的存放區,這是代管擴充功能的模組版本。與 module_ctx.modules 中顯示的 module.version 欄位相同。可能會傳回 None

package_group

None native.package_group(name, packages=[], includes=[])

這個函式會定義一組套件,並將標籤指派給群組。您可以在 visibility 屬性中參照這個標籤。

參數

參數 說明
name 必填
這項規則的專屬名稱。
packages 字串序列;預設值為 []
這個群組中的套件完整列舉。
includes 字串序列;預設值為 []
此套件中包含的其他套件群組。

package_name

string native.package_name()

接受評估的套件名稱。例如,在 BUILD 檔案中,其值為 some/packagesome/package/BUILD如果 BUILD 檔案呼叫在 .bzl 檔案中定義的函式,package_name() 會與呼叫端 BUILD 檔案套件比對。此函式等同於已淘汰的變數 PACKAGE_NAME

package_relative_label

Label native.package_relative_label(input)

在目前正在初始化的套件環境中 (也就是執行目前巨集的 BUILD 檔案),將輸入字串轉換為「Label」物件。如果輸入內容已經是 Label,則傳回不變。

只有在評估 BUILD 檔案及其直接或間接呼叫的巨集時,才能呼叫此函式;不能在 (例如) 規則實作函式中呼叫這個函式。

這個函式的結果與 Label 值相同,將指定字串傳遞至 BUILD 檔案中所宣告目標的標籤值屬性時產生的值。

使用注意事項:這個函式和 Label() 的差異在於 Label() 會使用呼叫該檔案的 .bzl 檔案套件,而非 BUILD 檔案的套件。如要參照以硬式編碼方式寫入巨集的固定目標 (例如編譯器),請使用 Label()。需要將 BUILD 檔案提供的標籤字串正規化為 Label 物件時,請使用 package_relative_label()。(如果套件不是 BUILD 檔案或呼叫 .bzl 檔案,就無法將字串轉換為 Label)。因此,外部巨集應一律優先將標籤物件傳送至內部巨集,而不是標籤字串)。

參數

參數 說明
input string;或 Label;必填
輸入標籤字串或標籤物件。如果傳送的是標籤物件,則會傳回原樣。

repository_name

string native.repository_name()

呼叫規則或建構擴充功能的存放區名稱。例如,如果 WORKSPACE 空白區 local_repository(name='local', path=...) 呼叫存在的套件,這個套件會設為 @local。在主要存放區中的套件中,系統會將它設為 @。此函式等同於已淘汰的變數 REPOSITORY_NAME

子套件

sequence native.subpackages(include, exclude=[], allow_empty=False)

傳回目前套件中所有直接子套件的新可變動清單,無論檔案系統目錄深度為何。傳回的清單會經過排序,其中包含與目前套件相關的子套件名稱。建議優先使用 bazel_skylib.subpackages 模組中的方法,而不要直接呼叫此函式。

參數

參數 說明
include stringsequence;必要
要納入子套件掃描的 glob 模式清單。
exclude 「string」序列;預設值為 []
從子套件掃描中排除的 glob 模式清單。
allow_empty 預設值為 False
表示呼叫是否傳回空白清單。根據預設,空白清單代表 BUILD 檔案可能發生了超大量的 subpackages() 呼叫。如果設為 true,這個函式就會執行成功。