自動執行群組 (AEG)

回報問題 查看原始碼 Nightly · 8.2 · 8.1 · 8.0 · 7.6 · 7.5

自動化執行群組會為每個工具鍊類型選取執行平台。換句話說,一個目標可以有多個執行平台,而無須定義執行群組。

簡要說明

自動化執行群組與工具鍊緊密連結。如果您使用工具鍊,則必須新增 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 是系統為依規則註冊的每個工具鍊類型自動建立 AEG 執行群組。與「傳統」exec 群組不同,您無須手動設定。此外,AEG 的名稱會自動設為工具鍊類型 (例如 //tools:toolchain_type_1)。

何時該使用自訂 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,即可在專案中完全停用 AEG (旗標的 GitHub 問題),或是將 _use_auto_exec_groups 屬性設為 False 來停用特定規則 (屬性詳細資料)。

遷移至 AEG 時出現錯誤訊息

無法辨識工具是否來自隱含的依附元件或工具鍊。請設定工具鍊參數。如果您並未使用工具鍊,請將其設為「None」。

  • 在這個範例中,您會在錯誤發生之前取得堆疊呼叫,並且清楚查看需要工具鍊參數的確切動作。請檢查動作使用的工具鍊,並使用工具鍊參數設定該工具鍊。如果工具或執行檔的動作中沒有使用工具鍊,請將其設為 None

已宣告動作,用於不存在的工具鍊「[toolchain_type]」。

  • 這表示您已在動作中設定工具鍊參數,但尚未在規則中註冊該參數。註冊工具鍊或在動作中設定 None

其他資料

詳情請參閱設計文件:自動化工具鍊的執行群組