自動執行群組會為每個工具鍊類型選取執行平台。換句話說,一個目標可以有多個執行平台,而不必定義執行群組。
簡要說明
自動執行群組與工具鍊密切相關。如果您使用工具鍊,需要透過新增 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
中的執行檔,以及使用 //tools:toolchain_type_2
執行檔的 Second action
。在 AEG 之前,這兩項動作都會在支援兩種工具鍊類型的單一執行平台上執行。使用 AEG 後,只要在動作中加入 toolchain
參數,每項動作都會在提供工具鍊的執行平台上執行。這些動作可能會在不同的執行平台上執行。
同樣的道理也適用於 ctx.actions.run_shell,其中應在 tools
來自工具鍊時新增 toolchain
參數。
自訂執行群組和自動執行群組之間的差異
顧名思義,AEG 是自動為規則中註冊的各工具鍊類型自動建立的執行群組。而且您不需要手動指定,因為與「傳統」執行群組不同。
何時該使用自訂 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),
}
)
這項操作會讓 AEG 僅在 my_rule
中啟用,且在選取執行平台時,其動作會開始使用新的邏輯。系統會用這項屬性覆寫不相容的標記。
如何在發生錯誤時停用 AEG?
將 --incompatible_auto_exec_groups
設為 false,即可完全停用專案中的 AEG (旗標的 GitHub 問題),或是將 _use_auto_exec_groups
屬性設為 False
(進一步瞭解屬性)。
遷移至 AEG 時顯示的錯誤訊息
無法辨別工具是否來自隱含依附元件或工具鍊。請設定工具鍊參數。如果不是使用工具鍊,請設為「無」。
- 在這種情況下,您會在錯誤發生前收到呼叫堆疊,並且可以清楚查看需要工具鍊參數的確切動作。查看用於動作的工具鍊,並使用工具鍊參數設定該工具鍊。如果工具或執行檔的動作中未使用工具鍊,請將其設為
None
。
已針對不存在的工具鍊「[toolchain_type]」宣告動作。
- 這表示您已在動作中設定工具鍊參數,但並未在規則中登錄該參數。註冊工具鍊或在動作中設定
None
。
其他資料
詳情請參閱設計文件:工具鍊的自動執行群組。