全局变量

在全局环境中注册的对象、函数和模块。

成员

全部

bool all(elements)

如果所有元素的求值结果均为 true 或集合为空,则返回 true。元素通过 bool 函数转换为布尔值。
all(["hello", 3, True]) == True
all([-1, 0, 1]) == False

参数

参数 说明
elements 必需
字符串或元素集合。

analysis_test_transition

transition analysis_test_transition(settings)

创建要应用于分析测试规则依赖项的配置转换。此过渡期只能应用于具有 analysis_test = True 的规则的属性。此类规则的功能受到限制(例如,其依赖项树的大小受限),因此与使用 transition 创建的转场效果相比,使用此函数创建的转场效果的潜在范围受到限制。

此函数主要用于简化 Analysis Test Framework 核心库的使用。如需了解最佳实践,请参阅其文档(或其实现)。

参数

参数 说明
settings required
此字典包含有关此配置转换应设置的配置设置的信息。键是 build 设置标签,值是转换后的新值。所有其他设置保持不变。使用此属性声明分析测试需要设置的特定配置设置,以便测试能够通过。

任意

bool any(elements)

如果至少有一个元素的计算结果为 True,则返回 true。系统会使用 bool 函数将元素转换为布尔值。
any([-1, 0, 1]) == True
any([False, 0, ""]) == False

参数

参数 说明
elements 必需
一个字符串或一组元素。

archive_override

None archive_override(module_name, urls, integrity='', strip_prefix='', patches=[], patch_cmds=[], patch_strip=0)

指定此依赖项应来自特定位置的归档文件(zip、gzip 等),而不是来自注册表。此指令仅在根模块中生效;换句话说,如果某个模块被其他模块用作依赖项,则系统会忽略该模块自己的替换项。

参数

参数 说明
module_name 必需
要将此替换项应用到的 Bazel 模块依赖项的名称。
urls string; or Iterable of strings; 必需
归档文件的网址;可以是 http(s):// 或 file:// 网址。
integrity default = ''
归档文件的预期校验和(采用子资源完整性格式)。
strip_prefix default = ''
要从解压缩的文件中删除的目录前缀。
patches Iterable of strings; default = []
指向要应用于此模块的补丁文件的标签列表。补丁文件必须存在于顶级项目的源代码树中。系统会按照列表顺序应用这些规则。
patch_cmds Iterable of strings; default = []
在应用补丁后在 Linux/Macos 上应用的 Bash 命令序列。
patch_strip 默认值 = 0
与 Unix 补丁的 --strip 参数相同。

切面

Aspect aspect(implementation, attr_aspects=[], attrs=None, required_providers=[], required_aspect_providers=[], provides=[], requires=[], fragments=[], host_fragments=[], toolchains=[], incompatible_use_toolchain_transition=False, doc='', *, apply_to_generating_rules=False, exec_compatible_with=[], exec_groups=None)

创建新方面。此函数的结果必须存储在全局值中。如需了解详情,请参阅“Aspects 简介”。

参数

参数 说明
implementation required
一个用于实现此切面的 Starlark 函数,恰好有两个参数:Target(应用切面的目标)和 ctx(创建目标时所依据的规则上下文)。目标的属性可通过 ctx.rule 字段获取。在分析阶段,系统会针对将某个方面应用于目标的每次操作来评估此函数。
attr_aspects sequence of strings; 默认值为 []
属性名称列表。该切面会沿着目标的属性中使用这些名称指定的依赖项传播。此处的常见值包括 depsexports。该列表还可以包含单个字符串 "*",以沿着目标的所有依赖项传播。
attrs dict; or None; default = None
一个声明切面所有属性的字典。它用于从属性名称映射到属性对象,例如 `attr.label` 或 `attr.string`(请参阅 attr 模块)。作为 ctx 形参的字段,这些方面属性可供实现函数使用。

_ 开头的隐式属性必须具有默认值,并且类型为 labellabel_list

显式属性必须为 string 类型,并且必须使用 values 限制。显式属性会限制相应方面只能与具有相同名称、类型和有效值的规则搭配使用(具体取决于限制)。

required_providers default = []
借助此属性,此方面可以将其传播限制为仅限规则中宣传其所需提供商的目标。该值必须是包含单个提供商或提供商列表的列表,但不能同时包含这两者。例如,[[FooInfo], [BarInfo], [BazInfo, QuxInfo]] 是一个有效值,而 [FooInfo, BarInfo, [BazInfo, QuxInfo]] 无效。

非嵌套提供商列表会自动转换为包含一个提供商列表的列表。也就是说,[FooInfo, BarInfo] 将自动转换为 [[FooInfo, BarInfo]]

为了使某些规则(例如 some_rule)目标对切面可见,some_rule 必须通告至少一个必需提供商列表中的所有提供商。例如,如果某个方面(aspect)的 required_providers[[FooInfo], [BarInfo], [BazInfo, QuxInfo]],则只有当 some_rule 提供 FooInfo *或* BarInfo *或* BazInfo *和* QuxInfo 时,此方面才能看到 some_rule 目标。

required_aspect_providers default = []
此属性允许此 aspect 检查其他 aspect。该值必须是包含单个提供商或提供商列表的列表,但不能同时包含这两者。例如,[[FooInfo], [BarInfo], [BazInfo, QuxInfo]] 是一个有效值,而 [FooInfo, BarInfo, [BazInfo, QuxInfo]] 无效。

非嵌套提供商列表会自动转换为包含一个提供商列表的列表。也就是说,[FooInfo, BarInfo] 将自动转换为 [[FooInfo, BarInfo]]

若要使另一个 aspect(例如 other_aspect)对此 aspect 可见,other_aspect 必须提供至少一个列表中的所有提供程序。在 [[FooInfo], [BarInfo], [BazInfo, QuxInfo]] 示例中,只有当 other_aspect 提供 FooInfo *或* BarInfo *或* BazInfo *和* QuxInfo 时,此方面才能看到 other_aspect

provides default = []
实现函数必须返回的提供程序列表。

如果实现函数从其返回值中省略了此处列出的任何提供程序类型,则会出错。不过,实现函数可能会返回此处未列出的其他提供程序。

列表中的每个元素都是 provider() 返回的 *Info 对象,但旧版提供程序则由其字符串名称表示。

requires sequence of Aspects; default = []
在此 aspect 之前需要传播的 aspect 的列表。
fragments sequence of strings; default = []
该切面在目标配置中所需的配置 fragment 的名称列表。
host_fragments sequence of strings; default = []
切面在主机配置中所需的配置 fragment 的名称列表。
toolchains sequence; default = []
如果设置,则表示此规则所需的工具链集。该列表可以包含 String、Label 或 StarlarkToolchainTypeApi 对象,可以任意组合。系统会通过检查当前平台来查找工具链,并通过 ctx.toolchain 将其提供给规则实现。
incompatible_use_toolchain_transition default = False
已废弃,此属性已不再使用,应予移除。
doc default = ''
可通过文档生成工具提取的切面的说明。
apply_to_generating_rules default = False
如果为 true,则在应用于输出文件时,该方面将应用于输出文件的生成规则。

例如,假设某个方面通过属性 `deps` 传递,并应用于目标 `alpha`。假设 `alpha` 的 `deps = [':beta_output']`,其中 `beta_output` 是目标 `beta` 的声明输出。假设 `beta` 的 `deps` 之一是目标 `charlie`。如果该方面的 `apply_to_generating_rules=True`,则该方面将通过 `alpha`、`beta` 和 `charlie` 传播。如果为 False,则该方面将仅传播到 `alpha`。

默认值为 false。

exec_compatible_with sequence of strings; default = []
适用于此方面所有实例的执行平台限制的列表。
exec_groups dict; or None; default = None
执行组名称(字符串)的 Dict 设置为 exec_groups。如果设置,则允许在单个实例中对多个执行平台运行操作。如需了解详情,请参阅执行组文档

bazel_dep

None bazel_dep(name, version='', max_compatibility_level=-1, repo_name='', dev_dependency=False)

声明对其他 Bazel 模块的直接依赖项。

参数

参数 说明
name required
要作为直接依赖项添加的模块的名称。
version default = ''
要添加为直接依赖项的模块的版本。
max_compatibility_level 默认值 = -1
要添加为直接依赖项的模块支持的 compatibility_level 上限。模块的版本暗示支持的最低 compatibility_level,以及如果未指定此属性则支持的最高 compatibility_level。
repo_name default = ''
表示此依赖项的外部代码库的名称。默认情况下,这是模块的名称。
dev_dependency 默认值 = False
如果为 true,当当前模块不是根模块或启用了 `--ignore_dev_dependency` 时,系统会忽略此依赖项。

绑定

None bind(name, actual=None)

警告:不建议使用 bind()。如需详细了解 bind 的问题和替代方案,请参阅考虑移除 bind

//external 软件包中的目标指定别名。

参数

参数 说明
name 必需
“//external”下的标签,用作别名名称
actual string; or None; 默认值为 None
要添加别名的真实标签

bool

bool bool(x=False)

bool 类型的构造函数。如果对象为 NoneFalse、空字符串 ("")、数字 0 或空集合(例如 ()[]),则返回 False;否则,返回 True

参数

参数 说明
x default = False
要转换的变量。

configuration_field

LateBoundDefault configuration_field(fragment, name)

引用类型为标签的属性的延迟绑定默认值。如果某个值需要先构建配置,然后才能确定其值,则该值为“延迟绑定”。使用此值的任何属性都必须设为私有

用法示例:

定义规则属性:

'_foo': attr.label(default=configuration_field(fragment='java', name='toolchain'))

在规则实现中进行访问:

  def _rule_impl(ctx):
    foo_info = ctx.attr._foo
    ...

参数

参数 说明
fragment required
包含延迟绑定值的配置 fragment 的名称。
name required
要从配置 fragment 中获取的值的名称。

depset

depset depset(direct=None, order="default", *, transitive=None)

创建 depsetdirect 参数是依赖项集的直接元素的列表,transitive 参数是依赖项集的列表,其元素会成为所创建依赖项集的间接元素。将 depset 转换为列表时返回元素的顺序由 order 参数指定。如需了解详情,请参阅依赖项集概览

依赖项集的所有元素(直接和间接)都必须为同一类型,如通过表达式 type(x) 获取的类型。

由于基于哈希的集合用于在迭代期间消除重复项,因此 depset 的所有元素都应可哈希化。不过,目前并未在所有构造函数中一致地检查此不变量。使用 --incompatible_always_check_depset_elements 标志可启用一致性检查;这将是未来版本中的默认行为;请参阅问题 10313

此外,元素目前必须是不可变的,但我们日后会放宽此限制。

创建的 depset 的顺序应与其 transitive depset 的顺序兼容"default" 顺序与任何其他顺序兼容,所有其他顺序仅与自身兼容。

关于向后/向前兼容性的说明。此函数目前接受位置 items 参数。该参数已废弃,未来将被移除,移除后 direct 将成为 depset 函数的唯一位置参数。因此,以下两个调用是等效的,并且可适应未来需求:

depset(['a', 'b'], transitive = [...])
depset(direct = ['a', 'b'], transitive = [...])

参数

参数 说明
direct sequence; or None; 默认值为 None
depset 的直接元素的列表。
order default = "default"
新出发集的遍历策略。如需了解可能的值,请点击此处
transitive sequence of depsets; or None; 默认值为 None
depset 的列表,其元素将成为 depset 的间接元素。

字典

dict dict(pairs=[], **kwargs)

根据可选的位置参数和一组可选的关键字参数创建字典。如果多次提供相同的键,系统将使用最后一个值。系统会将通过关键字参数提供的条目视为在通过位置参数提供的条目之后。

参数

参数 说明
pairs default = []
字典或可迭代对象,其元素长度均为 2(键、值)。
kwargs 必需
额外条目的字典。

dir

list dir(x)

返回一个字符串列表:参数对象的属性和方法的名称。

参数

参数 说明
x 必需
要检查的对象。

枚举

list enumerate(list, start=0)

返回一个包含对(两个元素的元组)的列表,其中包含输入序列中的索引 (int) 和项。
enumerate([24, 21, 84]) == [(0, 24), (1, 21), (2, 84)]

参数

参数 说明
list 所需的
输入序列。
start 默认值为 0
起始索引。

exec_group

exec_group exec_group(toolchains=[], exec_compatible_with=[], copy_from_rule=False)

创建执行组,以便在规则实施期间为特定执行平台创建操作。

参数

参数 说明
toolchains sequence; 默认值为 []
此执行组所需的一组工具链。列表可以包含 String、Label 或 StarlarkToolchainTypeApi 对象,可以任意组合。
exec_compatible_with sequence of strings; default = []
执行平台上的约束条件列表。
copy_from_rule default = False
如果设置为 true,此执行组会继承该组附加到的规则的工具链和限制条件。如果将其设置为任何其他字符串,则会抛出错误。

fail

None fail(msg=None, attr=None, *args)

会导致执行失败并出现错误。

参数

参数 说明
msg default = None
已废弃:请改用位置参数。此参数的作用类似于隐式前置位置参数。
attr string; or None;默认值为 None
已弃用。会导致在错误消息中添加包含此字符串的可选前缀。
args 必需
一个值列表,以 str 格式化并用空格连接,显示在错误消息中。

float

float float(x=unbound)

以浮点值形式返回 x。
  • 如果 x 已是浮点值,float 会将其按原样返回。
  • 如果 x 是布尔值,float 会针对 True 返回 1.0,针对 False 返回 0.0。
  • 如果 x 是整数,float 会返回 x 最接近的有限浮点值;如果大小过大,则返回错误。
  • 如果 x 是一个字符串,它必须是有效的浮点字面量,或者等于(忽略大小写)NaNInfInfinity,可以选择性地在前面加上 +- 符号。
任何其他值都会导致错误。如果不指定参数,float() 会返回 0.0。

参数

参数 说明
x default = unbound
要转换的值。

getattr

unknown getattr(x, name, default=unbound)

返回结构体中具有给定名称的字段(如果存在)。否则,它将返回 default(如果已指定)或引发错误。getattr(x, "foobar") 等效于 x.foobar
getattr(ctx.attr, "myattr")
getattr(ctx.attr, "myattr", "mydefault")

参数

参数 说明
x 必需
要访问其属性的结构体。
name 必需
结构体属性的名称。
default default = unbound
如果结构体没有给定名称的属性,则返回的默认值。

git_override

None git_override(module_name, remote, commit='', patches=[], patch_cmds=[], patch_strip=0)

指定依赖项应来自 Git 代码库的某个提交。此指令仅在根模块中生效;换句话说,如果某个模块被其他模块用作依赖项,则系统会忽略该模块自己的替换项。

参数

参数 说明
module_name 必需
要将此替换项应用到的 Bazel 模块依赖项的名称。
remote required
:远程 Git 代码库的网址。
commit default = ''
应签出的提交。
patches Iterable of strings; 默认值为 []
指向要为此模块应用的补丁文件的标签列表。补丁文件必须存在于顶级项目的源代码树中。它们按列表顺序应用。
patch_cmds Iterable of strings; default = []
在应用补丁后在 Linux/Macos 上应用的 Bash 命令序列。
patch_strip default = 0
与 Unix 补丁的 --strip 参数相同。

hasattr

bool hasattr(x, name)

如果对象 x 具有给定 name 的属性或方法,则返回 True,否则返回 False。示例:
hasattr(ctx.attr, "myattr")

参数

参数 说明
x 必需
要检查的对象。
name required
属性的名称。

哈希

int hash(value)

返回字符串的哈希值。使用与 Java 的 String.hashCode() 相同的算法确定性地计算该值,即:
s[0] * (31^(n-1)) + s[1] * (31^(n-2)) + ... + s[n-1]
目前不支持对字符串以外的值进行哈希处理。

参数

参数 说明
value 必需
要哈希的字符串值。

int

int int(x, base=unbound)

以 int 值的形式返回 x。
  • 如果 x 已是 int,则 int 会按原样返回它。
  • 如果 x 是布尔值,则 int 会针对 True 返回 1,针对 False 返回 0。
  • 如果 x 是字符串,则必须采用 <sign><prefix><digits> 格式。<sign>"+""-" 或空(解释为正值)。<digits> 是从 0 到 base-1 的数字序列,其中字母 a-z(或等效的 A-Z)用作数字 10-35。如果 base 为 2/8/16,则 <prefix> 为可选项,可以分别为 0b/0o/0x(或等效的 0B/0O/0X);如果 base 是除这些基数或特殊值 0 之外的任何其他值,则前缀必须为空。如果 base 为 0,则系统会将字符串解释为整数字面量,也就是说,系统会根据使用的前缀(如果有)选择 2/8/10/16 基数之一。如果 base 为 0,则不使用前缀;如果有多个数字,则前导数字不能为 0;这是为了避免八进制和十进制之间的混淆。字符串表示的数值的大小必须在 int 类型的允许范围内。
  • 如果 x 是浮点数,int 会返回该浮点数的整数值,并向零舍入。如果 x 是非有限值(NaN 或无穷大),则报告错误。
如果 x 是任何其他类型,或者值是不符合上述格式的字符串,则此函数会失败。与 Python 的 int 函数不同,此函数不允许零参数,也不允许字符串参数出现多余的空格。

示例:

int("123") == 123
int("-123") == -123
int("+123") == 123
int("FF", 16) == 255
int("0xFF", 16) == 255
int("10", 0) == 10
int("-0x10", 0) == -16
int("-0x10", 0) == -16
int("123.456") == 123

参数

参数 说明
x required
要转换的字符串。
base 默认值 = 未绑定
用于解读字符串值的底数;默认为 10。必须介于 2 到 36(包括这两个数值)之间,或者为 0,以便将基数检测为 x 是整数字面量。如果值不是字符串,则不得提供此参数。

len

int len(x)

返回字符串、序列(例如列表或元组)、字典或其他可迭代的长度。

参数

参数 说明
x 必需
要报告其长度的值。

list

list list(x=[])

返回与给定可迭代值具有相同元素的新列表。
list([1, 2]) == [1, 2]
list((2, 3, 2)) == [2, 3, 2]
list({5: "a", 2: "b", 4: "c"}) == [5, 2, 4]

参数

参数 说明
x default = []
要转换的对象。

local_path_override

None local_path_override(module_name, path)

指定依赖项应来自本地磁盘上的某个目录。此指令仅在根模块中生效;换句话说,如果某个模块被其他模块用作依赖项,则系统会忽略该模块自己的替换项。

参数

参数 说明
module_name 必需
要将此替换项应用到的 Bazel 模块依赖项的名称。
path required
此模块所在目录的路径。

max

unknown max(*args)

返回所有给定参数中最大的一个。如果只提供一个参数,该参数必须是非空的可迭代对象。如果元素不可比较(例如,整数与字符串),或者未提供任何参数,则会发生错误。
max(2, 5, 4) == 5
max([5, 6, 3]) == 6

参数

参数 说明
args required
要检查的元素。

分钟

unknown min(*args)

返回所有给定参数中最小的一个。如果仅提供了一个参数,则该参数必须是非空可迭代对象。如果元素不可比较(例如整数与字符串),或者未提供任何参数,则会引发错误。
min(2, 5, 4) == 2
min([5, 6, 3]) == 3

参数

参数 说明
args required
要检查的元素。

module

None module(name='', version='', compatibility_level=0, repo_name='', bazel_compatibility=[])

声明当前 Bazel 代码库所代表的 Bazel 模块的某些属性。这些属性要么是模块的基本元数据(例如名称和版本),要么会影响当前模块及其依赖项的行为。

最多只能调用一次。只有当此模块是根模块(即不会被其他模块依赖)时,才能省略它。

参数

参数 说明
name default = ''
模块的名称。只有当此模块是根模块(即不会被其他模块依赖)时,才能省略。有效的模块名称必须满足以下条件:1) 只能包含小写字母 (a-z)、数字 (0-9)、点 (.)、连字符 (-) 和下划线 (_);2) 以小写字母开头;3) 以小写字母或数字结尾。
version default = ''
模块的版本。仅当此模块是根模块(即不会被其他模块依赖)时,才可以省略。
compatibility_level default = 0
模块的兼容性级别;每次引入不兼容的重大更改时,都应更改此级别。从 SemVer 的角度来看,这实际上是模块的“主要版本”,只不过它不是嵌入在版本字符串本身中,而是作为单独的字段存在。具有不同兼容性级别的模块在版本解析中参与的方式就像它们是具有不同名称的模块一样,但最终的依赖项图不能包含多个名称相同但兼容性级别不同的模块(除非 multiple_version_override 生效;如需了解详情,请参阅该部分)。
repo_name default = ''
代表此模块的代码库的名称(由模块本身看到)。默认情况下,代码库的名称与模块的名称相同。您可以指定此值,以便为一直使用与其模块名称不同的代码库名称的项目简化迁移。
bazel_compatibility Iterable of strings; default = []
一个 Bazel 版本列表,可让用户声明哪些 Bazel 版本与此模块兼容。这不会影响依赖项解析,但 bzlmod 会使用此信息来检查您当前的 Bazel 版本是否兼容。此值的格式为由英文逗号分隔的若干约束条件值的字符串。支持三种约束条件:<=X.X.X:Bazel 版本必须等于或低于 X.X.X。当较新版本中存在已知的不兼容更改时,使用此约束条件。>=X.X.X:Bazel 版本必须不低于 X.X.X。当您依赖于仅在 X.X.X 之后提供的一些功能时,请使用此属性。-X.X.X:Bazel 版本 X.X.X 不兼容。当 X.X.X 中存在会导致问题的 bug,但在较高版本中已修复时,可以使用此属性。

module_extension

unknown module_extension(implementation, *, tag_classes={}, doc='')

创建新的模块扩展。请将其存储在全局值中,以便将其导出并在 MODULE.bazel 文件中使用。

参数

参数 说明
implementation required
实现此模块扩展的函数。必须接受单个参数 module_ctx。系统会在构建开始时调用此函数一次,以确定一组可用代码库。
tag_classes default = {}
用于声明扩展程序使用的所有标记类的字典。它会将标记类的名称映射到 tag_class 对象。
doc default = ''
模块扩展的说明,可由文档生成工具提取。

multiple_version_override

None multiple_version_override(module_name, versions, registry='')

指定依赖项应仍来自注册库,但应允许其多个版本共存。如需了解详情,请参阅相关文档。此指令仅在根模块中有效;换言之,如果某个模块被其他模块用作依赖项,该指令自己的替换项会被忽略。

参数

参数 说明
module_name 必需
要将此替换项应用到的 Bazel 模块依赖项的名称。
versions Iterable of strings; 必需
明确指定允许共存的版本。这些版本必须已存在于依赖项图预选中。此模块的依赖项将“升级”到同一兼容性级别中允许的最近较高版本,而版本高于同一兼容性级别中允许的任何版本的依赖项将导致错误。
registry default = ''
替换此模块的注册表;应使用指定的注册表,而不是从默认的注册表列表中查找此模块。

输出

None print(sep=" ", *args)

args 输出为调试输出。其前缀为字符串 "DEBUG" 和此调用的位置(文件和行号)。参数转换为字符串的确切方式未指定,可能随时发生变化。具体而言,它可能与 str()repr() 执行的格式设置不同(并且更详细)。

我们不建议在正式版代码中使用 print,因为它会给用户造成一些垃圾内容。对于废弃项,请尽可能使用 fail() 报告严重错误。

参数

参数 说明
sep default = " "
对象之间的分隔符字符串,默认为空格(“ ”)。
args required
要输出的对象。

provider

unknown provider(doc='', *, fields=None, init=None)

定义提供程序符号。您可以通过调用来实例化提供程序,也可以直接将其用作从目标中检索该提供程序实例的键。示例:
MyInfo = provider()
...
def _my_library_impl(ctx):
    ...
    my_info = MyInfo(x = 2, y = 3)
    # my_info.x == 2
    # my_info.y == 3
    ...

如需有关如何使用提供程序的全面指南,请参阅规则(提供程序)

如果未指定 init,则返回 Provider 可调用值。

如果指定了 init,则返回一个包含 2 个元素的元组:一个 Provider 可调用值和一个原始构造函数可调用值。如需了解详情,请参阅规则(自定义提供程序的自定义初始化)以及下面对 init 参数的讨论。

参数

参数 说明
doc default = ''
提供方说明,可由文档生成工具提取。
fields sequence of strings; or dict; or None;默认值为 None
如果指定,则限制允许的字段集。
可能的值包括:
  • 字段列表:
    provider(fields = ['a', 'b'])

  • 字典字段名称 -> 文档:
    provider(
           fields = { 'a' : 'Documentation for a', 'b' : 'Documentation for b' })
所有字段均为选填字段。
init callable; or None;默认值为 None
一个可选回调,用于在实例化期间预处理和验证提供程序的字段值。如果指定了 initprovider() 会返回一个包含 2 个元素的元组:常规提供程序符号和原始构造函数

下面提供了精确的说明;如需直观地了解相关讨论和用例,请参阅规则(提供程序的自定义初始化)

P 为通过调用 provider() 创建的提供方符号。从概念上讲,P 的实例是通过调用默认构造函数 c(*args, **kwargs) 生成的,该函数会执行以下操作:

  • 如果 args 不为空,则会发生错误。
  • 如果在调用 provider() 时指定了 fields 参数,并且 kwargs 包含 fields 中未列出的任何键,则会发生错误。
  • 否则,c 会返回一个新实例,该实例对于 kwargs 中的每个 k: v 条目,都具有一个名为 k 且值为 v 的字段。
如果未指定 init 回调,对符号 P 本身的调用会被视为对默认构造函数 c 的调用;换句话说,P(*args, **kwargs) 会返回 c(*args, **kwargs)例如,
MyInfo = provider()
m = MyInfo(foo = 1)
可以直接让 m 成为具有 m.foo == 1MyInfo 实例。

但在指定了 init 的情况下,调用 P(*args, **kwargs) 将改为执行以下步骤:

  1. 回调会以 init(*args, **kwargs) 的形式调用,即使用与传递给 P 完全相同的位置参数和关键字参数。
  2. init 的返回值应为字典 d,其键为字段名称字符串。否则就会发生错误。
  3. 系统会生成 P 的新实例,就像使用 d 的条目作为关键字参数调用默认构造函数一样(如 c(**d) 中所示)。

注意:上述步骤表明,如果 *args**kwargsinit 的签名不匹配,或者 init 正文的求值失败(可能通过调用 fail() 故意导致),或者 init 的返回值不是具有预期架构的字典,则会发生错误。

这样一来,init 回调通过允许使用位置参数和任意逻辑进行预处理和验证,从而对常规提供程序构建进行了概括。它不会绕过允许的 fields 列表。

指定 init 后,provider() 的返回值会变为元组 (P, r),其中 r原始构造函数。事实上,r 的行为与上述默认构造函数 c 的行为完全相同。通常,r 会绑定到名称带有下划线前缀的变量,以便只有当前的 .bzl 文件可以直接访问它:

MyInfo, _new_myinfo = provider(init = ...)

范围

sequence range(start_or_stop, stop_or_none=None, step=1)

创建一个列表,其中条目从 startstop,以 step 为增量。如果只提供一个参数,则各个项的范围为 0 到该元素。
range(4) == [0, 1, 2, 3]
range(3, 9, 2) == [3, 5, 7]
range(3, 0, -1) == [3, 2, 1]

参数

参数 说明
start_or_stop 必需
如果提供了 stop,则为 start 元素的值;否则为 stop 的值,实际的开始时间为 0
stop_or_none int; or None; 默认值为 None
第一个不要包含在生成的列表中的项的可选索引;列表的生成会在达到 stop 之前停止。
step 默认值 = 1
增量(默认值为 1)。此值可以为负数。

register_execution_platforms()

None register_execution_platforms(*platform_labels)

注册已定义的平台,以便 Bazel 在工具链解析期间将其用作执行平台

参数

参数 说明
platform_labels sequence of strings;必需
要注册的平台的标签。

register_execution_platforms(dev_dependency)

None register_execution_platforms(dev_dependency=False, *platform_labels)

指定选择此模块时要注册的已定义的执行平台。应为绝对目标模式(即以 @// 开头)。如需了解详情,请参阅工具链解析

参数

参数 说明
dev_dependency 默认值为 False
如果为 true,当当前模块不是根模块或启用了 `--ignore_dev_dependency` 时,系统不会注册执行平台。
platform_labels sequence of strings; 必需
要注册的平台的标签。

register_toolchains()

None register_toolchains(*toolchain_labels)

注册已定义的工具链,以便 Bazel 在工具链解析期间使用它。请参阅定义注册工具链的示例。

参数

参数 说明
toolchain_labels sequence of strings; 必需
要注册的工具链的标签。

register_toolchains(dev_dependency)

None register_toolchains(dev_dependency=False, *toolchain_labels)

指定在选择此模块时要注册的已定义工具链。应为绝对目标模式(即以 @// 开头)。如需了解详情,请参阅工具链解析

参数

参数 说明
dev_dependency default = False
如果为 true,如果当前模块不是根模块或启用了“--ignore_dev_dependency”,则不会注册工具链。
toolchain_labels sequence of strings;必需
要注册的工具链的标签。

repository_rule(implementation, attrs, local, environ, configure, remotable, doc)

callable repository_rule(implementation, *, attrs=None, local=False, environ=[], configure=False, remotable=False, doc='')

创建新的代码库规则。将其存储在全局值中,以便从 WORKSPACE 文件加载和调用它。

参数

参数 说明
implementation required
实现此规则的函数。必须有一个参数 repository_ctx。在规则的每个实例的加载阶段都会调用该函数。
attrs dict; or None; 默认值为 None
用于声明规则的所有属性的字典。它用于从属性名称映射到属性对象(请参阅 attr 模块)。以 _ 开头的属性是私有属性,可用于为文件添加对标签的隐式依赖项(仓库规则不能依赖于生成的工件)。系统会隐式添加属性 name,因此不得指定该属性。
local default = False
表示此规则会从本地系统提取所有内容,并且在每次提取时都应重新评估。
environ sequence of strings; 默认值为 []
提供此代码库规则依赖的环境变量列表。如果该列表中的环境变量发生更改,系统会重新提取代码库。
configure default = False
表示代码库会出于配置目的检查系统
remotable 默认值为 False
实验性。此参数目前处于实验阶段,随时可能发生变化。请勿依赖此功能。您可以通过设置 ---experimental_repo_remote_exec
Compatible with remote execution 以实验性方式启用该功能
doc default = ''
可由文档生成工具提取的代码库规则的说明。

repository_rule(implementation, attrs, local, environ, configure, remotable, doc)

callable repository_rule(implementation, *, attrs=None, local=False, environ=[], configure=False, remotable=False, doc='')

创建新的代码库规则。将其存储在全局值中,以便从 WORKSPACE 文件加载和调用它。

参数

参数 说明
implementation 必需
用于实现此规则的函数。必须有一个参数 repository_ctx。系统会在规则的每个实例的加载阶段调用该函数。
attrs dict; or None; default = None
字典,用于声明规则的所有属性。它用于从属性名称映射到属性对象(请参阅 attr 模块)。以 _ 开头的属性是私有属性,可用于为文件添加对标签的隐式依赖项(仓库规则不能依赖于生成的工件)。系统会隐式添加属性 name,因此不得指定该属性。
local default = False
表示此规则会从本地系统提取所有内容,并且应在每次提取时重新评估。
environ sequence of strings; 默认值为 []
提供此代码库规则依赖的环境变量列表。如果该列表中的环境变量发生更改,系统会重新提取代码库。
configure default = False
表示代码库会出于配置目的检查系统
remotable 默认值为 False
实验性。此参数目前处于实验阶段,随时可能发生变化。请勿依赖此功能。您可以通过设置 ---experimental_repo_remote_exec
Compatible with remote execution 以实验性方式启用该功能
doc default = ''
仓库规则的说明,可由文档生成工具提取。

repr

string repr(x)

将任何对象转换为字符串表示形式。这对于调试非常有用。
repr("ab") == '"ab"'

参数

参数 说明
x required
要转换的对象。

reversed

list reversed(sequence)

返回一个新的未冻结列表,其中包含原始可迭代序列的元素,且按倒序排列。
reversed([3, 5, 4]) == [4, 5, 3]

参数

参数 说明
sequence 必需
要反转的可迭代序列(例如列表)。

规则

callable rule(implementation, test=False, attrs=None, outputs=None, executable=False, output_to_genfiles=False, fragments=[], host_fragments=[], _skylark_testable=False, toolchains=[], incompatible_use_toolchain_transition=False, doc='', *, provides=[], exec_compatible_with=[], analysis_test=False, build_setting=None, cfg=None, exec_groups=None, compile_one_filetype=None, name=None)

创建一个新规则,可从 BUILD 文件或宏调用该规则来创建目标。

规则必须分配给 .bzl 文件中的全局变量;全局变量的名称就是规则的名称。

测试规则的名称必须以 _test 结尾,而所有其他规则不得带有此后缀。(此限制仅适用于规则,不适用于其目标。)

参数

参数 说明
implementation 必需
实现此规则的 Starlark 函数只能有一个参数:ctx。在分析阶段,系统会针对规则的每个实例调用该函数。它可以访问用户提供的属性。它必须创建操作来生成所有声明的输出。
test default = False
指示此规则是否为测试规则,即是否可能是 blaze test 命令的正文。所有测试规则都会自动被视为可执行规则;没有必要(也不建议)为测试规则明确设置 executable = True如需了解详情,请参阅“规则”页面
attrs dict; or None; 默认值为 None
用于声明规则的所有属性的字典。它用于从属性名称映射到属性对象(请参阅 attr 模块)。以 _ 开头的属性是私有的,可用于向标签添加隐式依赖项。系统会隐式添加属性 name,因此无需指定该属性。系统会隐式添加属性 visibilitydeprecationtagstestonlyfeatures,且这些属性无法被替换。大多数规则只需要几个属性。为了限制内存用量,规则函数会对 attrs 的大小施加上限。
outputs dict; or None; or function; 默认值为 None
废弃。此参数已弃用,很快就会被移除。请勿依赖此功能。在 ---incompatible_no_rule_outputs_param 中,此功能处于停用状态。使用此标记验证您的代码与其即将移除的兼容性兼容。
此参数已被弃用。请改用 OutputGroupInfoattr.output 迁移规则。

用于定义预声明输出的架构。与 outputoutput_list 属性不同,用户不会为这些文件指定标签。如需详细了解预声明的输出,请参阅“规则”页面

此参数的值是字典,或者是生成字典的回调函数。回调的运作方式与计算依赖项属性类似:函数的参数名称会与规则的属性进行匹配,例如,如果您传递 outputs = _my_func 并使用定义 def _my_func(srcs, deps): ...,则该函数可以访问属性 srcsdeps。无论是直接指定字典还是通过函数指定字典,都会按如下方式解读。

字典中的每个条目都会创建一个预先声明的输出,其中键是标识符,值是用于确定输出标签的字符串模板。在规则的实现函数中,标识符成为用于访问 ctx.outputs 中输出 File 的字段名称。输出的标签与规则具有相同的软件包,软件包后面的部分是通过将形式为 "%{ATTR}" 的每个占位符替换为由属性 ATTR 的值组成的字符串而生成的:

  • 系统会逐字替换字符串类型的属性。
  • 标签类型的属性会成为文件包后面(不包括文件扩展名)的标签的一部分。例如,标签 "//pkg:a/b.c" 会变为 "a/b"
  • 输出类型的属性会成为软件包后面的标签的一部分,包括文件扩展名(在上述示例中为 "a/b.c")。
  • 占位符中使用的所有列表类型属性(例如 attr.label_list)都必须只有一个元素。其转化与非列表版本 (attr.label) 相同。
  • 其他属性类型不得出现在占位符中。
  • 特殊的非属性占位符 %{dirname}%{basename} 会扩展到规则标签的这些部分(不包括其软件包)。例如,在 "//pkg:a/b.c" 中,目录名称为 a,基名为 b.c

实际上,最常见的替代占位符是 "%{name}"。例如,对于名为“foo”的目标,输出字典 {"bin": "%{name}.exe"} 会预声明一个名为 foo.exe 的输出,该输出在实现函数中可通过 ctx.outputs.bin 访问。

executable default = False
确定此规则是否被视为可执行,即是否可以成为 blaze run 命令的正文。如需了解详情,请参阅“规则”页面
output_to_genfiles default = False
如果为 true,则文件将在 genfiles 目录中生成,而不是在 bin 目录中生成。除非您需要此标志来与现有规则保持兼容性(例如,为 C++ 生成头文件时),否则请勿设置此标志。
fragments sequence of strings; default = []
规则在目标配置中所需的配置 fragment 的名称列表。
host_fragments sequence of strings; default = []
该规则在主机配置中所需的配置 fragment 的名称列表。
_skylark_testable 默认值为 False
(实验性)

如果为 true,此规则将公开其操作,以便依赖于它的规则通过 Actions 提供程序进行检查。规则本身也可以通过调用 ctx.created_actions() 来使用该提供程序。

这应仅用于测试 Starlark 规则的分析时行为。此标志未来可能会被移除。
toolchains sequence; default = []
如果设置,则表示此规则所需的工具链集。该列表可以包含 String、Label 或 StarlarkToolchainTypeApi 对象,可以任意组合。系统会通过检查当前平台来查找工具链,并通过 ctx.toolchain 将其提供给规则实现。
incompatible_use_toolchain_transition default = False
已废弃,此属性已不再使用,应予移除。
doc default = ''
可由文档生成工具提取的规则说明。
provides default = []
implementation 函数必须返回的提供程序列表。

如果实现函数从其返回值中省略了此处列出的任何提供程序类型,则会出错。不过,实现函数可能会返回此处未列出的其他提供程序。

列表中的每个元素都是 provider() 返回的 *Info 对象,但旧版提供程序则由其字符串名称表示。

exec_compatible_with sequence of strings; default = []
适用于此规则类型的所有目标的执行平台限制列表。
analysis_test default = False
如果为 true,则系统会将此规则视为分析测试。

注意:分析测试规则主要使用 Starlark 核心库中提供的基础架构进行定义。如需相关指导,请参阅测试

如果将规则定义为分析测试规则,则允许对其属性使用使用 analysis_test_transition 定义的配置转换,但会选择接受一些限制:

  • 此规则的目标可能具有的传递依赖项数量有限。
  • 该规则会被视为测试规则(就像设置了 test=True 一样)。这会取代 test 的值
  • 规则实施函数可能无法注册操作。相反,它必须通过提供 AnalysisTestResultInfo 来注册通过/失败结果。
build_setting BuildSetting; or None;default = None
如果设置此字段,则表示此规则是哪类 build setting。请参阅 config 模块。设置此属性后,系统会自动将名为“build_setting_default”的必需属性添加到此规则,其类型与此处传入的值相对应。
cfg default = None
如果设置,则指向规则在分析之前将应用于其自身配置的配置转换。
exec_groups dict; or None; 默认值为 None
execution group name (string) to exec_groups 的字典。如果设置,则允许规则在单个目标中的多个执行平台上运行操作。如需了解详情,请参阅执行组文档
compile_one_filetype sequence of strings; or None; default = None
供 --compile_one_dependency 使用:如果有多个规则使用指定的文件,我们是否应该选择此规则而不是其他规则。
name string; or None; 默认值为 None
弃用。此参数已弃用,很快就会被移除。请勿依赖此功能。在 --+incompatible_remove_rule_name_parameter 中,此功能处于停用状态。使用此标志可验证您的代码是否与即将移除的 API 兼容。
已废弃:请勿使用。

此规则的名称,由 Bazel 理解并在日志记录、native.existing_rule(...)[kind]bazel query 等上下文中报告。通常,这与绑定到此规则的 Starlark 标识符相同;例如,名为 foo_library 的规则通常声明为 foo_library = rule(...),并在 BUILD 文件中作为 foo_library(...) 实例化。

如果省略此参数,则规则的名称会设置为在其声明的 .bzl 模块中要绑定到此规则的第一个 Starlark 全局变量的名称。因此,如果名称为 foo_libraryfoo_library = rule(...) 无需指定此参数。

为规则指定明确的名称不会改变可以实例化规则的位置。

选择

unknown select(x, no_match_error='')

select() 是一个辅助函数,用于使规则属性可配置。如需了解详情,请参阅 build 百科全书

参数

参数 说明
x required
将配置条件映射到值的字典。每个键都是一个标签或标签字符串,用于标识 config_setting 或 constraint_value 实例。如需了解何时使用标签而非字符串,请参阅有关宏的文档
no_match_error default = ''
无条件匹配时要报告的可选自定义错误。

single_version_override

None single_version_override(module_name, version='', registry='', patches=[], patch_cmds=[], patch_strip=0)

指定依赖项应仍来自注册库,但其版本应固定,或其注册库应被替换,或应用补丁列表。此指令仅在根模块中生效;换句话说,如果某个模块被其他模块用作依赖项,则系统会忽略该模块自己的替换项。

参数

参数 说明
module_name required
要应用此替换的 Bazel 模块依赖项的名称。
version default = ''
替换依赖关系图中此模块的声明版本。也就是说,此模块将“固定”到此替换版本。如果只想替换注册表或补丁,则可以忽略此属性。
registry default = ''
替换此模块的注册表;应使用给定注册表,而不是从默认注册表列表中查找此模块。
patches Iterable of strings; 默认值为 []
指向要为此模块应用的补丁文件的标签列表。补丁文件必须存在于顶级项目的源代码树中。系统会按照列表顺序应用这些规则。
patch_cmds Iterable of strings; default = []
应用补丁后,在 Linux/Macos 上应用的 Bash 命令序列。
patch_strip 默认值 = 0
与 Unix 补丁的 --strip 参数相同。

已排序

list sorted(iterable, *, key=None, reverse=False)

返回一个新的已排序列表,其中包含提供的可迭代序列的所有元素。如果无法使用 x < y 比较任何一对元素 x、y,则可能会发生错误。元素会按升序排序,除非 reverse 参数为 True,在这种情况下,排序方式为降序。 排序是稳定的:比较相等的元素会保留其原始的相对顺序。
sorted([3, 5, 4]) == [3, 4, 5]

参数

参数 说明
iterable 必需
要排序的可迭代序列。
key default = None
在比较之前对每个元素应用的可选函数。
reverse default = False
Return results in descending order.

str

string str(x)

将任何对象转换为字符串。这在调试时很有用。
str("ab") == "ab"
str(8) == "8"

参数

参数 说明
x 必需
要转换的对象。

tag_class

tag_class tag_class(attrs={}, *, doc='')

创建一个新的 tag_class 对象,用于为一类代码定义属性架构。这些代码是模块扩展程序可使用的数据对象。

参数

参数 说明
attrs default = {}
用于声明此标记类的所有属性的字典。它用于从属性名称映射到属性对象(请参阅 attr 模块)。
doc default = ''
标记类的说明,可由文档生成工具提取。

tuple

tuple tuple(x=())

返回与给定可迭代值具有相同元素的元组。
tuple([1, 2]) == (1, 2)
tuple((2, 3, 2)) == (2, 3, 2)
tuple({5: "a", 2: "b", 4: "c"}) == (5, 2, 4)

参数

参数 说明
x default = ()
要转换的对象。

类型

string type(x)

返回其参数的类型名称。这对于调试和类型检查非常有用。示例:
type(2) == "int"
type([1]) == "list"
type(struct(a = 2)) == "struct"
此功能将来可能会发生变化。如需编写与 Python 兼容且面向未来的代码,请仅将其用于比较返回值:
if type(x) == type([]):  # if x is a list

参数

参数 说明
x required
要检查其类型的对象。

use_extension

module_extension_proxy use_extension(extension_bzl_file, extension_name, *, dev_dependency=False, isolate=False)

返回一个代表模块扩展程序的代理对象;您可以调用其方法来创建模块扩展程序标记。

参数

参数 说明
extension_bzl_file required
Starlark 文件的标签,用于定义模块扩展。
extension_name 必需
要使用的模块扩展程序的名称。Starlark 文件必须导出具有此名称的符号。
dev_dependency 默认值 = False
如果为 true,当当前模块不是根模块或启用了 `--ignore_dev_dependency` 时,系统会忽略模块扩展的这种用法。
isolate default = False
如果为 true,则模块扩展程序的此用法将与此模块和其他模块中的所有其他用法隔离。为此用途创建的代码不会影响其他用途,并且扩展程序为此用途生成的代码库将与扩展程序生成的所有其他代码库区分开来。

use_repo

None use_repo(extension_proxy, *args, **kwargs)

将给定模块扩展程序生成的一个或多个代码库导入到当前模块的范围内。

参数

参数 说明
extension_proxy 必需
use_extension 调用返回的模块扩展代理对象。
args 必填
要导入的代码库的名称。
kwargs 必需
指定要以其他名称导入到当前模块范围内的特定代码库。键应为当前作用域中要使用的名称,而值应为模块扩展程序导出的原始名称。

visibility

None visibility(value)

设置当前正在初始化的 .bzl 模块的加载可见性。

模块的加载可见性决定了其他 BUILD 和 .bzl 文件能否加载该模块。(这与底层 .bzl 源文件的目标可见性不同,后者用于控制该文件是否可以显示为其他目标的依赖项。)加载可见性在软件包级别起作用:要加载模块,执行加载的文件必须位于已被授予模块可见性的软件包中。无论模块的可见性如何,都可以始终在其自己的软件包中加载。

每个 .bzl 文件只能调用一次 visibility(),且只能在顶级调用,不能在函数内调用。首选样式是将此调用放在 load() 语句和确定实参所需的任何简短逻辑的下方。

如果将标志 --check_bzl_visibility 设为 false,加载可见性违规问题将会发出警告,但不会导致构建失败。

参数

参数 说明
value required
软件包规范字符串列表或单个软件包规范字符串。

软件包规范遵循与 package_group 相同的格式,但不允许使用否定软件包规范。也就是说,规范可以采用以下格式:

  • "//foo":软件包 //foo
  • "//foo/...":软件包 //foo 及其所有子软件包。
  • "public""private":分别表示所有软件包或无软件包

不允许使用“@”语法;所有规范都相对于当前模块的代码库进行解读。

如果 value 是字符串列表,则授予对此模块可见性的软件包集是每个规范所代表的软件包的并集。(空列表的效果与 private 相同。)如果 value 是单个字符串,则会被视为单例列表 [value]

请注意,--incompatible_package_group_has_public_syntax--incompatible_fix_package_group_reporoot_syntax 标志对此参数没有影响。"public""private" 值始终可用,并且 "//..." 始终会被解释为“当前代码库中的所有软件包”。

工作区

None workspace(name)

此函数只能在 WORKSPACE 文件中使用,并且必须在 WORKSPACE 文件中的所有其他函数之前声明。每个 WORKSPACE 文件都应有一个 workspace 函数。

设置此工作区的名称。工作区名称应为项目的 Java 软件包式说明,使用下划线作为分隔符。例如,github.com/bazelbuild/bazel 应使用 com_github_bazelbuild_bazel。

此名称用于存储代码库运行文件的目录。例如,如果本地代码库中有 runfile foo/bar,并且 WORKSPACE 文件包含 workspace(name = 'baz'),则 runfile 将在 mytarget.runfiles/baz/foo/bar 下可用。如果未指定工作区名称,则 runfile 将通过符号链接到 bar.runfiles/foo/bar

远程代码库规则名称必须是有效的工作区名称。例如,您可以使用 maven_jar(name = 'foo'),但不能使用 maven_jar(name = 'foo%bar'),因为 Bazel 会尝试为包含 workspace(name = 'foo%bar')maven_jar 写入 WORKSPACE 文件。

参数

参数 说明
name 必填
工作区的名称。名称必须以字母开头,并且只能包含字母、数字、下划线、短划线和圆点。

zip

list zip(*args)

返回一个由 tuple 组成的 list,其中第 i 个元组包含每个实参序列或可迭代对象中的第 i 个元素。该列表具有最短输入的大小。如果只有一个可迭代参数,则会返回一个包含 1 个元组的列表。如果没有参数,则返回空列表。示例:
zip()  # == []
zip([1, 2])  # == [(1,), (2,)]
zip([1, 2], [3, 4])  # == [(1, 3), (2, 4)]
zip([1, 2], [3, 4, 5])  # == [(1, 3), (2, 4)]

参数

参数 说明
args 需要压缩的
列表。