Grupos de ejecución automática (AEG)

Los grupos de ejecución automática seleccionan una plataforma de ejecución para cada tipo de cadena de herramientas. En otras palabras, un destino puede tener varias plataformas de ejecución sin definir grupos de ejecución.

Resumen breve

Los grupos de ejecución automática están estrechamente conectados con las cadenas de herramientas. Si utilizas cadenas de herramientas, debes establecerlas en las acciones afectadas (acciones que usan un ejecutable o una herramienta de una cadena de herramientas) agregando el parámetro toolchain. Por ejemplo:

ctx.actions.run(
    ...,
    executable = ctx.toolchain['@bazel_tools//tools/jdk:toolchain_type'].tool,
    ...,
    toolchain = '@bazel_tools//tools/jdk:toolchain_type',
)

Si la acción no usa una herramienta o un ejecutable de una cadena de herramientas y el Blaze no detecta eso (se genera el error), puedes configurar toolchain = None

Si necesitas usar varias cadenas de herramientas en una sola plataforma de ejecución (una acción usa ejecutables o herramientas de dos o más cadenas de herramientas), debes hacerlo manualmente define exec_groups (marca ¿Cuándo debo usar un exec_group personalizado? ).

Historial

Antes de los AEG, la plataforma de ejecución se seleccionaba a nivel de la regla. Por ejemplo:

my_rule = rule(
    _impl,
    toolchains = ['//tools:toolchain_type_1', '//tools:toolchain_type_2'],
)

La regla my_rule registra dos tipos de cadenas de herramientas. Esto significa que la Cadena de herramientas Se usó la resolución para encontrar una plataforma de ejecución que admita ambos tipos de cadenas de herramientas. Los seleccionados de ejecución de código se usó para cada acción registrada dentro de la regla, a menos se especifica de manera diferente con exec_groups. En otras palabras, todas las acciones de la regla solían tener una sola ejecución. de procesamiento, incluso si usaban herramientas de diferentes cadenas de herramientas (plataforma de ejecución para cada objetivo). Esto provocó fallas cuando no había de ejecución compatible con todas las cadenas de herramientas.

Estado actual

Con AEGs, se selecciona la plataforma de ejecución para cada tipo de cadena de herramientas. El de implementación del ejemplo anterior, my_rule, se vería de la siguiente manera:

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',
    )

Esta regla crea dos acciones, la First action que utiliza ejecutable desde un //tools:toolchain_type_1 y el Second action, que usa ejecutables desde un //tools:toolchain_type_2 Antes de los AEG, se ejecutaban ambas acciones. en una sola plataforma de ejecución que admita ambos tipos de cadenas de herramientas. Con los AEG, Si agregas el parámetro toolchain dentro de las acciones, cada acción se ejecutará en la plataforma de ejecución que proporciona la cadena de herramientas. Las acciones se pueden ejecutar en diferentes plataformas de ejecución.

Lo mismo es efectivo con ctx.actions.run_shell, donde toolchain El parámetro se debe agregar cuando los tools son de una cadena de herramientas.

Diferencia entre los grupos de ejecutivos personalizados y los grupos de ejecutivos automáticos

Como su nombre lo indica, los AEG son grupos ejecutivos creados automáticamente para cada tipo de cadena de herramientas registrado en una regla. No es necesario especificarlos manualmente, a diferencia de la "versión clásica" exec groups.

¿Cuándo debo usar un exec_group personalizado?

Los exec_groups personalizados solo se necesitan en caso de que varias cadenas de herramientas necesiten se ejecutan en una plataforma única. En todos los demás casos, no hay necesidad define exec_groups personalizados. Por ejemplo:

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'],
        ),
    }
)

Migración de AEG

Internamente, en google3, Blaze ya está usando AEG. A nivel externo para Bazel, la migración está en proceso. Algunas reglas ya están utilizando esta función (por ejemplo, las reglas de Java y C++).

¿Qué versiones de Bazel admiten esta migración?

Los AEG son totalmente compatibles con Bazel 7.

¿Cómo habilitar los AEG?

Establecer --incompatible_auto_exec_groups como verdadero. Más información sobre la marca sobre el problema de GitHub.

¿Cómo habilitar AEG dentro de una regla en particular?

Configura el atributo _use_auto_exec_groups en una regla.

my_rule = rule(
    _impl,
    attrs = {
      "_use_auto_exec_groups": attr.bool(default = True),
    }
)

Esto habilita AEG solo en my_rule y sus acciones comienzan a usar la nueva lógica cuando seleccionas la plataforma de ejecución. La marca incompatible se anula con esto .

¿Cómo inhabilitar los AEG en caso de error?

Establece --incompatible_auto_exec_groups como falso para inhabilitar por completo los AEG en tu proyecto (problema de GitHub de la marca) o inhabilitar una regla en particular estableciendo el atributo _use_auto_exec_groups en False (más detalles sobre el atributo).

Mensajes de error durante la migración a AEG

No se pudo identificar si las herramientas provienen de dependencias implícitas o de una cadena de herramientas. Configura el parámetro de la cadena de herramientas. Si no usas una cadena de herramientas, configúrala como “None”.

  • En este caso, obtiene una pila de llamadas antes de que ocurra el error y puede ver con claridad qué acción exacta necesita el parámetro de la cadena de herramientas. Verificar La cadena de herramientas se usa para la acción y la configura con el parámetro de la cadena de herramientas. Si la respuesta es no La cadena de herramientas se usa dentro de la acción para herramientas o ejecutable, configúrala para None

Se declaró la acción para la cadena de herramientas inexistente '[toolchain_type]'.

  • Es decir, estableciste el parámetro de la cadena de herramientas en la acción, pero no registrarla en la regla. Registra la cadena de herramientas o configura None dentro de la acción.

Material adicional

Para obtener más información, consulta el documento de diseño: Grupos de ejecución automáticos para cadenas de herramientas.