En esta página, se describe cómo extender el lenguaje BUILD usando macros y reglas.
Las extensiones de Bazel son archivos que terminan en .bzl
. Usa un
load statement para importar un símbolo de una extensión.
Antes de aprender los conceptos más avanzados, haz lo siguiente:
Lee acerca del lenguaje Starlark, que se usa tanto en el Archivos
BUILD
y.bzl
.Obtén más información para compartir variables. entre dos archivos
BUILD
.
Macros y reglas
Una macro es una función que crea una instancia de reglas. Resulta útil cuando un elemento
El archivo BUILD
se está volviendo demasiado repetitivo o complejo, ya que te permite volver a usarlo
algo de código. La función se evalúa en cuanto se lee el archivo BUILD
. Después del
la evaluación del archivo BUILD
, Bazel tiene poca información sobre las macros:
Si la macro genera un genrule
, Bazel se comportará como si escribieras el
genrule
Como resultado, bazel query
solo mostrará las genrule
generadas.
Una regla es más potente que una macro. Puede acceder a Bazel y control total de lo que sucede. Puede, por ejemplo, pasar información a otras reglas.
Si quieres reutilizar la lógica simple, comienza con una macro. Si una macro se vuelve complejo, suele ser una buena idea establecerla como una regla. Compatibilidad con un idioma nuevo generalmente se realiza con una regla. Las reglas son para usuarios avanzados y la mayoría los usuarios nunca tendrán que escribir uno; solo se cargarán y llamarán las reglas de firewall.
Modelo de evaluación
Una compilación consta de tres fases.
Fase de carga. Primero, carga y evalúa todas las extensiones y todos los
BUILD
los archivos necesarios para la compilación. La ejecución de los archivosBUILD
simplemente crea una instancia de reglas (cada vez que se llama a una regla, esta se agrega a un gráfico). Aquí es donde se evalúan las macros.Fase de análisis. Se ejecuta el código de las reglas (su
implementation
(función) y se crean instancias de acciones. Una acción describe cómo generar Un conjunto de resultados a partir de un conjunto de entradas, como “run gcc on hello.c and get hello.o”. Debes indicar explícitamente qué archivos se generarán antes ejecutar los comandos reales. En otras palabras, la fase de análisis toma el gráfico generado por la fase de carga y genera un gráfico de acciones.Fase de ejecución. Las acciones se ejecutan cuando al menos uno de sus resultados como en los productos necesarios. Si falta un archivo o si un comando no genera un resultado, la compilación falla. Las pruebas también se ejecutan durante esta fase.
Bazel usa el paralelismo para leer, analizar y evaluar los archivos .bzl
y BUILD
.
archivos. Se lee un archivo como máximo una vez por compilación y el resultado de la evaluación
almacenar en caché y reutilizarse. Un archivo se evalúa solo una vez que todas sus dependencias (load()
declaraciones) se hayan resuelto. Por diseño, la carga de un archivo .bzl
no tiene
efecto secundario, solo define valores y funciones.
Bazel intenta ser inteligente: usa el análisis de dependencias para saber qué archivos qué reglas deben cargarse, qué reglas deben analizarse y qué acciones deben ejecutarse. Para Por ejemplo, si una regla genera acciones que no necesitas para la compilación actual, no se ejecutarán.
Cómo crear extensiones
Crea tu primera macro para hacer lo siguiente: reutilizar algún código. Luego, obtén más información sobre las macros y usarlos para crear "verbos personalizados".
Sigue el instructivo de reglas para comenzar a usar reglas. A continuación, puedes leer más sobre los conceptos de reglas.
Los dos vínculos que aparecen a continuación te resultarán muy útiles cuando escribas tus propias extensiones. Conservar a su alcance:
Un paso más allá
Además de macros y reglas, también puedes escribir aspectos y reglas de repositorio.
Usa Buildifier. de manera coherente para formatear y analizar tu código con lint.
Sigue la guía de estilo de
.bzl
.Prueba el código.
Genera documentación para ayudar a los usuarios.
Optimiza el rendimiento de tu código.
Implementa tus extensiones para otras personas.