自動執行群組會選取執行平台 每種工具鍊類型換句話說,一個指定目標中可以有多個 執行平台而未定義執行群組。
簡要說明
自動化執行群組與工具鍊緊密連結。如果使用
工具鍊,您需要為受影響的動作設定 (使用
可執行檔或工具鍊的工具),新增 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 遷移
Blaze 已在內部透過 google3 使用 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,即可完全停用
(旗標的 GitHub 問題) 或停用特定規則
將 _use_auto_exec_groups
屬性設為 False
(進一步瞭解屬性)。
遷移至 AEG 時出現錯誤訊息
無法辨識工具是否來自隱含的依附元件或工具鍊。請設定工具鍊參數。如果您並未使用工具鍊,請將其設為「None」。
- 在這個範例中,您會在錯誤發生前收到堆疊呼叫,且
以便清楚查看哪些確切動作需要工具鍊參數。查看
工具鍊用於動作,並使用工具鍊參數設定該動作。如果答案為「否」
工具鍊的動作會使用工具鍊或執行檔的動作,請將工具鍊設為
None
。
已宣告動作,用於不存在的工具鍊「[toolchain_type]」。
- 這表示您已經在動作中設定 Toolchain 參數,但未設定
在該規則中註冊這個金鑰註冊工具鍊或在動作中設定
None
。
其他資料
詳情請參閱設計文件: 自動執行工具鍊的執行群組。