En esta página, se describe cómo extender el lenguaje BUILD con macros y reglas.
Las extensiones de Bazel son archivos que terminan en .bzl. Usa una
instrucción de carga para importar un símbolo de una extensión.
Antes de aprender los conceptos más avanzados, haz lo siguiente:
Lee sobre el lenguaje Starlark, que se usa en los archivos
BUILDy.bzl.Aprende a compartir variables entre dos archivos
BUILD.
Macros y reglas
Una macro es una función que instancia reglas. Es útil cuando un
BUILD archivo se vuelve demasiado repetitivo o complejo, ya que te permite reutilizar
parte del código. La función se evalúa en cuanto se lee el archivo BUILD. Después
de la evaluación del archivo BUILD, Bazel tiene poca información sobre las macros:
si tu macro genera una genrule, Bazel se comportará como si escribieras la
genrule. Como resultado, bazel query solo mostrará la genrule generada.
Una regla es más potente que una macro. Puede acceder a los elementos internos de Bazel y tener control total sobre lo que sucede. Por ejemplo, puede pasar información a otras reglas.
Si deseas reutilizar una lógica simple, comienza con una macro. Si una macro se vuelve compleja, suele ser una buena idea convertirla en una regla. La compatibilidad con un nuevo lenguaje suele hacerse con una regla. Las reglas son para usuarios avanzados, y la mayoría de los usuarios nunca tendrán que escribir una; solo cargarán y llamarán a las reglas existentes.
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
BUILDarchivos que se necesitan para la compilación. La ejecución de losBUILDarchivos solo instancia reglas (cada vez que se llama a una regla, 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
implementationfunción) y se instancian las acciones. Una acción describe cómo generar un conjunto de salidas a partir de un conjunto de entradas, como "ejecutar gcc en hello.c y obtener hello.o". Debes enumerar de forma explícita qué archivos se generarán antes de 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 se requiere al menos una de sus salidas. Si falta un archivo o si un comando no puede generar una salida, 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. Un archivo se lee como máximo una vez por compilación, y el resultado de la evaluación se
almacena en caché y se reutiliza. Un archivo se evalúa solo una vez que se resuelven todas sus dependencias (load()
instrucciones). Por diseño, cargar un archivo .bzl no tiene efectos secundarios visibles, solo define valores y funciones.
Bazel intenta ser inteligente: usa el análisis de dependencias para saber qué archivos se deben cargar, qué reglas se deben analizar y qué acciones se deben ejecutar. 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 reutilizar parte del código. Luego, obtén más información sobre las macros y cómo usarlas 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 las reglas.
Los dos vínculos que se muestran a continuación serán muy útiles cuando escribas tus propias extensiones. Tenlos a mano:
Más información
Además de las macros y las reglas, es posible que desees escribir aspectos y reglas de repositorio.
Usa Buildifier de manera coherente para dar formato a tu código y realizar un análisis de lint.
Sigue la
.bzlguía de estilo.Prueba tu código.
Genera documentación para ayudar a tus usuarios.
Optimiza el rendimiento de tu código.
Implementa tus extensiones para otras personas.