自動執行群組 (AEG)

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

簡要說明

自動化執行群組與工具鍊緊密連結。如果使用 工具鍊,您需要為受影響的動作設定 (使用 可執行檔或工具鍊的工具),新增 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_1Second 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

其他資料

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