自动执行组选择一个执行平台 。也就是说,一个定位条件可以有多个 执行平台,而无需定义执行组。
快速摘要
自动执行组与工具链密切相关。如果您使用的是
工具链,您需要在受影响的操作(使用
可执行文件或工具链中的工具)。toolchain
例如:
ctx.actions.run(
...,
executable = ctx.toolchain['@bazel_tools//tools/jdk:toolchain_type'].tool,
...,
toolchain = '@bazel_tools//tools/jdk:toolchain_type',
)
如果操作不使用工具或工具链中的可执行文件,并且 Blaze
(发现错误),您可以设置
toolchain = None
。
如果您需要在单个执行平台上使用多个工具链(一项操作) 使用来自两个或多个工具链的可执行文件或工具),则需要手动 定义 exec_groups(检查 何时应使用自定义 exec_group? 部分)。
历史记录
在 AEG 之前,执行平台是在规则一级选择的。例如:
my_rule = rule(
_impl,
toolchains = ['//tools:toolchain_type_1', '//tools:toolchain_type_2'],
)
规则 my_rule
注册了两种工具链类型。也就是说,工具链
使用的分辨率
寻找支持这两种工具链类型的执行平台。所选
执行平台,除非
exec_groups 指定不同的值。
换言之,该规则内的所有操作过去只能执行一次
平台,即使它们使用了来自不同工具链(执行平台)的工具
)。在没有实例时,这导致了
支持所有工具链的执行平台。
当前状态
使用 AEG 时,系统会为每种工具链类型选择执行平台。通过
上一个示例 my_rule
的实现函数如下所示:
def _impl(ctx):
ctx.actions.run(
mnemonic = "First action",
executable = ctx.toolchain['//tools:toolchain_type_1'].tool,
toolchain = '//tools:toolchain_type_1',
)
ctx.actions.run(
mnemonic = "Second action",
executable = ctx.toolchain['//tools:toolchain_type_2'].tool,
toolchain = '//tools:toolchain_type_2',
)
此规则会创建两项操作,即 First action
,该操作使用
//tools:toolchain_type_1
和 Second action
(使用
//tools:toolchain_type_2
。在 AEG 之前,这两项操作都需要执行
在一个支持两种工具链类型的执行平台上运行。对于 AEG,
通过在操作内添加 toolchain
形参,每个操作都会在
提供工具链的执行平台。这些操作可能
不同执行平台上。
这对 ctx.actions.run_shell 同样有效,其中 toolchain
参数应在 tools
来自工具链时添加。
自定义执行组和自动执行组之间的区别
顾名思义,AEG 就是针对每个 工具链类型。无需您手动指定它们 不同于“经典”exec 组。
何时应使用自定义 exec_group?
只有在需要多个工具链时才需要自定义 exec_groups 在单个执行平台上执行。在所有其他情况下 定义自定义 exec_groups。例如:
def _impl(ctx):
ctx.actions.run(
...,
executable = ctx.toolchain['//tools:toolchain_type_1'].tool,
tools = [ctx.toolchain['//tools:toolchain_type_2'].tool],
exec_group = 'two_toolchains',
)
my_rule = rule(
_impl,
exec_groups = {
"two_toolchains": exec_group(
toolchains = ['//tools:toolchain_type_1', '//tools:toolchain_type_2'],
),
}
)
AEG 的迁移
在 google3 内部,Blaze 已经在使用 AEG。 对于 Bazel,外部正在进行迁移。有些规则已在使用 功能(例如 Java 和 C++ 规则)。
哪些 Bazel 版本支持此迁移?
Bazel 7 完全支持 AEG。
如何启用 AEG?
将 --incompatible_auto_exec_groups
设置为 true。详细了解该标志
(请参阅 GitHub 问题)。
如何在特定规则内启用 AEG?
在规则上设置 _use_auto_exec_groups
属性。
my_rule = rule(
_impl,
attrs = {
"_use_auto_exec_groups": attr.bool(default = True),
}
)
这将仅在 my_rule
中启用 AEG,并且其操作开始使用新逻辑
。不兼容的标志被此替换
属性。
如何在出现错误时停用 AEG?
将 --incompatible_auto_exec_groups
设置为 false 以完全停用 AEG
您的项目(标志的 GitHub 问题),或停用特定规则
将 _use_auto_exec_groups
属性设置为 False
(有关该属性的更多详情)。
迁移到 AEG 时出现的错误消息
无法确定工具是来自隐式依赖项还是工具链。请设置工具链参数。如果不使用工具链,请将其设置为“None”。
- 在这种情况下,您在错误发生之前会收到一堆调用,
清楚地看到哪个确切操作需要工具链参数。查看
toolchain 用于操作,并使用 toolchain 参数对其进行设置。如果拒绝
工具链在工具或可执行文件的操作中使用,请将其设置为
None
。
针对不存在的工具链“[toolchain_type]”声明了操作。
- 这表示您已在操作上设置了工具链参数,但未
就可以将它注册在规则上注册工具链或在操作中设置
None
。
其他资料
如需了解详情,请参阅设计文档: 工具链的自动执行组。