本部分定义了 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 | 
 功能是可以在目标上启用或停用的字符串标记。通过 地图项的具体含义取决于规则本身。 此  | 
| restricted_to | 
 可以构建此目标的环境列表,而非 默认支持的环境。 
这是 Bazel 限制条件系统的一部分。请参阅
 | 
| tags | 
   
  标记可以用于任何规则。测试和
   
  如果 Bazel 发现以下内容,就会修改其沙盒代码的行为
  任何测试或  
 测试上的标记通常用于注释测试在测试中的作用 调试和发布流程。通常,标记对 C++ 和 Python 最为有用 测试,此类测试缺少任何运行时注解功能。代码和尺寸的使用 元素可以灵活地基于代码库来组装测试套件 签到政策。 
  如果 Bazel 在
  测试规则的  
 | 
| target_compatible_with | 
 
一系列
 间接依赖于不兼容目标的目标本身就是 视为不兼容。构建和测试时会跳过这些测试。 空列表(这是默认值)表示目标兼容 支持所有平台 
 
除工作区规则之外的所有规则都支持此项
属性。
对于某些规则,此属性无效。例如,指定
 
 请参阅 平台 页,详细了解不兼容的跳过目标。 | 
| testonly | 
 如果为 True,则只有 testonly 目标(例如测试)可以依赖于此目标。 
与之类似,非  
测试( 此属性旨在表明,不得使用 包含在已发布正式版的二进制文件中包含的文件。 因为 testonly 在构建时强制执行,在运行时不会强制执行,并且会传播 因此应谨慎应用。对于 例如存根和伪造 对于单元测试很有用;对于集成测试 包含将要发布到生产环境的相同二进制文件;以及 因此可能不应标记为 testonly。反过来, 链接也非常危险,也许是因为 替换正常行为,则务必标记为 testonly。 | 
| toolchains | 
 
  此目标所属的 Make 变量所属的目标集
  访问。这些目标是提供
   
 
  请注意,这与
    工具链解析
    。您不能使用此
  属性来确定哪些特定  | 
| visibility | 
 
目标上的  | 
所有测试规则通用的属性 (*_test)
本部分介绍了所有测试规则共有的属性。
| 属性 | 说明 | ||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| args | 
 Bazel 传递给目标的命令行参数
使用  
这些参数会在任何  | ||||||||||||||||||||
| env | 
   
  指定在执行测试时要设置的其他环境变量
   
  此属性仅适用于原生规则,例如  | ||||||||||||||||||||
| env_inherit | 
 指定要从
  外部环境。 
  此属性仅适用于原生规则,例如  | ||||||||||||||||||||
| size | 
 指定测试目标的“重量”:测试需要运行多长时间/资源。 单元测试被视为“小型测试”,集成测试被视为“中测试”,端到端测试被视为“大型测试”或
“enormous”。Bazel 会根据该大小确定默认超时,您可以使用
 测试大小对应于以下默认超时和假设的本地资源峰值 使用: 
 环境变量  | ||||||||||||||||||||
| timeout | 
 测试在返回之前预计会运行多长时间。 
虽然测试的大小属性控制资源估算,但测试的
超时时间可单独设置。如果未明确指定,则
超时时间取决于测试的大小。测试
可以用  
 
对于上述时间之外的时间,可以使用
 生成测试时,环境变量  | ||||||||||||||||||||
| flaky | 
 将测试标记为不稳定。 如果已设置,最多执行测试三次,仅当测试失败时才会将其标记为失败 都会失败默认情况下,此属性设置为 False,且测试为 只执行一次。请注意,通常不建议使用该属性, 测试应能可靠地通过其断言。 | ||||||||||||||||||||
| shard_count | 
 指定并行分片的数量 来运行测试 此值将覆盖用于确定
并行分片来运行测试。请注意,对于某些测试
规则,可能需要使用此参数才能启用分片
。另请参阅  如果已启用测试分片,则在生成测试时,环境变量  分片要求测试运行程序支持测试分片协议。 否则,它很可能在每个分片中运行每个测试, 并不是您想要的结果。 请参阅 测试分片 。 | ||||||||||||||||||||
| local | 
 强制测试在本地运行,而不采用沙盒机制。 将此设为 True 相当于提供“local”作为标记
( | 
所有二元规则通用的属性 (*_binary)
本部分介绍了所有二元规则共有的属性。
| 属性 | 说明 | 
|---|---|
| args | 
 
Bazel 将在执行时传递给目标的命令行参数
通过  
注意:运行目标时不会传递参数
(例如,通过在 Bazel 中手动执行
 | 
| env | 
 指定当目标是
  由  
  此属性仅适用于原生规则,例如  
注意:运行目标时不会设置环境变量
(例如,通过在 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 概念参考。