Los grupos de ejecución automáticos 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áticos están estrechamente conectados a las cadenas de herramientas. Si usas
cadenas de herramientas, debes configurarlas 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 Blaze
no lo detecta (se genera el error), puedes establecer
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 definir manualmente define exec_groups (consulta la sección ¿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 resolución
de la cadena de herramientas se usó
para encontrar una plataforma de ejecución que admita ambos tipos de cadenas de herramientas. La plataforma de ejecución seleccionada
se usó para cada acción registrada dentro de la regla, a menos que se
especifique lo contrario con exec_groups.
En otras palabras, todas las acciones dentro de la regla solían tener una sola plataforma de ejecución
, incluso si usaban herramientas de diferentes cadenas de herramientas (se selecciona una plataforma de ejecución
para cada destino). Esto provocó fallas cuando no había una
plataforma de ejecución que admitiera todas las cadenas de herramientas.
Estado actual
Con los AEG, la plataforma de ejecución se selecciona para cada tipo de cadena de herramientas. La
función 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 usa un ejecutable de
//tools:toolchain_type_1, y la Second action, que usa un ejecutable de
//tools:toolchain_type_2. Antes de los AEG, ambas acciones se ejecutarían
en una sola plataforma de ejecución que admite ambos tipos de cadenas de herramientas. Con los AEG,
si agregas el parámetro toolchain dentro de las acciones, cada acción se ejecuta 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 se debe agregar el toolchain
parámetro cuando las tools provienen de una cadena de herramientas.
Diferencia entre los grupos de ejecución personalizados y los grupos de ejecución automáticos
Como su nombre lo indica, los AEG son grupos de ejecución que se crean automáticamente para cada
tipo de cadena de herramientas registrada en una regla. No es necesario especificarlos de forma manual,
a diferencia de los grupos de ejecución "clásicos". Además, el nombre del AEG se establece automáticamente en
su tipo de cadena de herramientas (p.ej., //tools:toolchain_type_1).
¿Cuándo debo usar un exec_group personalizado?
Los exec_groups personalizados solo son necesarios en el caso de que se necesiten ejecutar varias cadenas de herramientas en una sola plataforma de ejecución. En todos los demás casos, no es necesario definir 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 usa AEG. Externamente para Bazel, la migración está en proceso. Algunas reglas ya usan esta función (p.ej., 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?
Establece --incompatible_auto_exec_groups como verdadero. Obtén más información sobre la marca
en el problema de GitHub.
¿Cómo habilitar los AEG dentro de una regla en particular?
Establece el atributo _use_auto_exec_groups en una regla.
my_rule = rule(
_impl,
attrs = {
"_use_auto_exec_groups": attr.bool(default = True),
}
)
Esto habilita los AEG solo en my_rule, y sus acciones comienzan a usar la nueva lógica
cuando se selecciona la plataforma de ejecución. La marca incompatible se anula con este
atributo.
¿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 inhabilita una regla en particular
estableciendo el atributo _use_auto_exec_groups como 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. Establece el parámetro de la cadena de herramientas. Si no usas una cadena de herramientas, establécela como "None".
- En este caso, obtienes una pila de llamadas antes de que se produzca el error y puedes
ver claramente qué acción exacta necesita el parámetro de la cadena de herramientas. Verifica qué
cadena de herramientas se usa para la acción y configúrala con el parámetro de la cadena de herramientas. Si no se usa ninguna
cadena de herramientas dentro de la acción para las herramientas o el ejecutable, establécela como
None.
Se declaró una acción para la cadena de herramientas "[toolchain_type]" inexistente.
- Esto significa que estableciste el parámetro de la cadena de herramientas en la acción, pero no
lo registraste en la regla. Registra la cadena de herramientas o establece
Nonedentro de la acción.
Material adicional
Para obtener más información, consulta el documento de diseño: Automatic exec groups for toolchains.