本部分定义了 Google Cloud 上的 许多函数或构建规则。
目录
- Bourne shell 令牌化
- 标签展开
- 大多数构建规则定义的典型属性
- 所有构建规则通用的属性
- 所有测试规则通用的属性 (*_test)
- 所有二元规则通用的属性 (*_binary)
- 可配置的属性
- 隐式输出目标
Bourne shell 令牌化
某些规则的某些字符串属性会拆分成多个 将单词转换为多个单词: 不带英文引号的空格用于分隔不同的字词,使用单引号和 英文双引号字符和反斜杠用于防止 标记化。
受此标记化影响的特性包括 本文档的定义中对此进行了明确说明。
受“品牌”约束的属性变量扩展和 Bourne shell
标记化通常用于将任意选项传递给
编译器和其他工具此类属性的示例包括
cc_library.copts
和java_library.javacopts
。
这些替换结合在一起,
扩展为特定于配置的列表的单个字符串变量
包含可选字词。
标签展开
只有极少数规则的某些字符串属性会带有标签
扩展:如果这些字符串包含有效标签,如
子字符串(例如 //mypkg:target
),并且该标签是一个
已声明的先决条件,则会扩展到
以
目标
//mypkg:target
。
例如,genrule.cmd
和
cc_binary.linkopts
。不同国家/地区的详情可能会
例如,相对标签是否
已展开;扩展到多个文件的标签是如何
等等。请参阅规则属性文档
。
大多数构建规则定义的典型属性
本部分介绍了由许多构建规则定义的属性, 而不是全部。
属性 | 说明 |
---|---|
data |
标签列表;默认值为 此规则在运行时所需的文件。可以列出文件或规则目标。一般 允许任何目标。
新规则在处理后,应定义 |
deps |
标签列表;默认值为
此目标的依赖项。通常,应仅列出规则目标。(尽管
有些规则允许文件直接列在 特定于语言的规则通常会将列出的目标限制为 特定提供商。
一个目标依赖于另一个目标,具体语义是
大多数情况下, |
licenses |
要用于此特定目标的许可类型字符串列表。 这是 Bazel 不再使用的已弃用许可 API 的一部分。错误做法 使用它。 |
srcs |
标签列表;默认值为
此规则处理或包含的文件。通常直接列出文件,但
可能会列出规则目标(例如 针对特定语言的规则通常要求列出的文件具有特定的 文件扩展名。 |
所有构建规则通用的属性
本部分介绍了隐式添加到所有 build 的属性 规则。
属性 | 说明 |
---|---|
compatible_with |
标签列表;
不可配置;默认值为 可以构建此目标的环境列表 默认支持的环境。 这是 Bazel 限制条件系统的一部分,该系统可让用户声明 目标可以和不能相互依赖。例如,可在外部部署 二进制文件不应依赖于包含公司密钥代码的库。请参阅 <ph type="x-smartling-placeholder"></ph> ConstraintSemantics。 |
deprecation |
与此目标相关的说明性警告消息。 通常情况下,此标识符用于通知用户某个定位条件已过时, 或已被其他规则取代、仅供软件包使用,或者 可能出于某种原因被视为有害的内容。建议添加 一些参考信息(如网页、错误编号或迁移 CL 示例),以便 以便用户轻松了解需要做出哪些更改来避免发送此类消息 如果有新的目标值可以用作替代品,它就是 最好只迁移旧目标的所有用户。
此属性不会影响内容的构建方式,但
可能会影响构建工具的诊断输出。构建工具会发出
当具有 软件包内依赖项不受此警告的影响, 例如,针对已弃用的规则构建测试 收到警告。 如果已弃用的目标依赖于其他已弃用的目标,则无警告 消息。 用户停止使用后,即可移除目标。 |
distribs |
要用于此特定目标的分发方法字符串列表。 这是 Bazel 不再使用的已弃用许可 API 的一部分。错误做法 使用它。 |
exec_compatible_with |
标签列表;
不可配置;默认值为
一系列
|
exec_properties |
字符串字典;默认值为 一个字符串字典,将添加到为此目标选择的平台的 如果某个键同时存在于平台级属性和目标级属性中,则系统将从目标中获取其值。 |
features |
feature 字符串列表;默认值为 功能是可以在目标上启用或停用的字符串标记。通过 地图项的具体含义取决于规则本身。 此 |
restricted_to |
标签列表;
不可配置;默认值为 可以构建此目标的环境列表,而非 默认支持的环境。
这是 Bazel 限制条件系统的一部分。请参阅
|
tags |
标记可以用于任何规则。测试和
如果 Bazel 发现以下内容,就会修改其沙盒代码的行为
任何测试或
测试上的标记通常用于注释测试在测试中的作用 调试和发布流程。通常,标记对 C++ 和 Python 最为有用 测试,此类测试缺少任何运行时注解功能。代码和尺寸的使用 元素可以灵活地基于代码库来组装测试套件 签到政策。
如果 Bazel 在
测试规则的
|
target_compatible_with |
标签列表;默认值为
一系列
间接依赖于不兼容目标的目标本身就是 视为不兼容。构建和测试时会跳过这些测试。 空列表(这是默认值)表示目标兼容 支持所有平台
除工作区规则之外的所有规则都支持此项
属性。
对于某些规则,此属性无效。例如,指定
请参阅 平台 页,详细了解不兼容的跳过目标。 |
testonly |
布尔值;不可配置;默认值为
如果为
与之类似,非
测试( 此属性旨在表明,不得使用 包含在已发布正式版的二进制文件中包含的文件。 因为 testonly 在构建时强制执行,在运行时不会强制执行,并且会传播 因此应谨慎应用。对于 例如存根和伪造 对于单元测试很有用;对于集成测试 包含将要发布到生产环境的相同二进制文件;以及 因此可能不应标记为 testonly。反过来, 链接也非常危险,也许是因为 替换正常行为,则务必标记为 testonly。 |
toolchains |
标签列表;
不可配置;默认值为
此目标所属的 Make 变量所属的目标集
访问。这些目标是提供
请注意,这与
工具链解析
。您不能使用此
属性来确定哪些特定 |
visibility |
标签列表;
不可配置;
默认为
目标上的 |
所有测试规则通用的属性 (*_test)
本部分介绍了所有测试规则共有的属性。
属性 | 说明 | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
args |
字符串列表;受制于
$(location) 和
创建变量" 替换以及
Bourne shell 令牌化;默认值为 Bazel 传递给目标的命令行参数
使用
这些参数会在任何 |
||||||||||||||||||||
env |
字符串字典;值受到
$(location) 和
"Make variable" 替换;默认值为
指定在执行测试时要设置的其他环境变量
此属性仅适用于原生规则,例如 |
||||||||||||||||||||
env_inherit |
字符串列表;默认值为 指定要从
外部环境。
此属性仅适用于原生规则,例如 |
||||||||||||||||||||
size |
字符串 指定测试目标的“重量”:测试需要运行多长时间/资源。 单元测试被视为“小型测试”,集成测试被视为“中测试”,端到端测试被视为“大型测试”或
“enormous”。Bazel 会根据该大小确定默认超时,您可以使用
测试大小对应于以下默认超时和假设的本地资源峰值 使用:
环境变量 |
||||||||||||||||||||
timeout |
字符串 测试在返回之前预计会运行多长时间。
虽然测试的大小属性控制资源估算,但测试的
超时时间可单独设置。如果未明确指定,则
超时时间取决于测试的大小。测试
可以用
对于上述时间之外的时间,可以使用
生成测试时,环境变量 |
||||||||||||||||||||
flaky |
将测试标记为不稳定。 如果已设置,最多执行测试三次,仅当测试失败时才会将其标记为失败 都会失败默认情况下,此属性设置为 False,且测试为 只执行一次。请注意,通常不建议使用该属性, 测试应能可靠地通过其断言。 |
||||||||||||||||||||
shard_count |
小于或等于 50 的非负整数;默认值为 指定并行分片的数量 来运行测试 如果设置,则此值将覆盖用于确定
并行分片来运行测试。请注意,对于某些测试
规则,可能需要使用此参数才能启用分片
。另请参阅 如果已启用测试分片,则在生成测试时,环境变量 分片要求测试运行程序支持测试分片协议。 否则,它很可能在每个分片中运行每个测试, 并不是您想要的结果。 请参阅 测试分片 。 |
||||||||||||||||||||
local |
强制测试在本地运行,而不采用沙盒机制。 将此设为 True 相当于提供“local”作为标记
( |
所有二元规则通用的属性 (*_binary)
本部分介绍了所有二元规则共有的属性。
属性 | 说明 |
---|---|
args |
字符串列表;受制于
$(location) 和
创建变量" 替换以及
Bourne shell 令牌化;
不可配置;
默认值为
Bazel 将在执行时传递给目标的命令行参数
通过
注意:运行目标时不会传递参数
(例如,通过在 Bazel 中手动执行
|
env |
字符串字典;值受到
$(location) 和
"Make variable" 替换;默认值为 指定当目标是
由
此属性仅适用于原生规则,例如
注意:运行目标时不会设置环境变量
(例如,通过在 Bazel 中手动执行
|
output_licenses |
字符串列表;默认值为 此二进制文件生成的输出文件的许可。 这是 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 会对可配置的属性进行评估
处理规则(从技术层面来讲,
<ph type="x-smartling-placeholder"></ph>
加载和分析阶段)。
在 select()
评估之前,任何处理都不会知道
select()
选择的分支。例如,宏无法更改
其行为,bazel query
可以
对目标的可配置依赖项进行保守推测。请参阅
<ph type="x-smartling-placeholder"></ph>
此常见问题解答
详细了解如何结合使用 select()
和规则和宏。
在其文档中标记为 nonconfigurable
的属性不得
使用此功能属性通常是不可配置的,因为 Bazel
内部需要知道其价值,然后才能确定如何解决
select()
。
请参阅 可配置 build 属性,详细了解相关信息。
隐式输出目标
C++ 中的隐式输出已被弃用。请避免使用 显示其他语言的版本。尚无弃用路径 但它们最终也会被弃用。
在 BUILD 文件中定义构建规则时,您要明确
在软件包中声明新的已命名规则目标很多 build 规则
函数还隐式包含一个或多个输出文件
目标,其内容和含义因规则而异。
例如,当您明确声明
java_binary(name='foo', ...)
条规则,您也是
隐式声明输出文件
将 foo_deploy.jar
定位为同一软件包的成员。
(此特定目标是一个独立的 Java 归档,
进行部署。)
隐式输出目标是全局
目标图表。与其他目标一样,它们是按需构建的
在顶级 build 命令中指定,或者当
是其他 build 目标的必要前提条件。它们可以是
在 BUILD 文件中作为依赖项引用,可在
bazel query
等分析工具的输出。
对于每种构建规则,规则的文档都包含 特殊部分,详细说明任何隐式 该规则声明所需的输出。
这两种广告之间
构建系统使用的两个命名空间:
标签用于标识目标
也就是规则或文件。文件目标可分为
源(或输入)文件目标和派生(或输出)文件
目标。以下是您可以在 BUILD 文件中提及的内容,
从命令行构建或使用 bazel query
进行检查;
这就是目标命名空间。每个文件目标都对应着
磁盘上的一个实际文件(“文件系统命名空间”);每条规则
目标可以对应于磁盘上的零个、一个或多个实际文件。
磁盘上可能存在没有对应目标的文件;用于
例如,在 C++ 编译期间生成的 .o
对象文件
不可从 BUILD 文件或命令行中引用。
这样,构建工具可能会隐藏
工作方式有关详情,请参阅
BUILD 概念参考。