Estos son algunos problemas y preguntas frecuentes relacionados con la escritura de extensiones.
¿Por qué no se produce mi archivo o no se ejecuta mi acción?
Bazel solo ejecuta las acciones necesarias para producir los archivos de salida solicitados.
Si el archivo que quieres tiene una etiqueta, puedes solicitarlo directamente:
bazel build //pkg:myfile.txt
Si el archivo se encuentra en un grupo de salida del destino, es posible que debas especificar ese grupo de salida en la línea de comandos:
bazel build //pkg:mytarget --output_groups=foo
Si quieres que el archivo se compile automáticamente cada vez que se mencione tu destino en la línea de comandos, agrégalo a los resultados predeterminados de tu regla devolviendo un proveedor de
DefaultInfo
.
Consulta la página de reglas para obtener más información.
¿Por qué no se ejecuta mi función de implementación?
Bazel analiza solo los destinos que se solicitan para la compilación. Debes nombrar el destino en la línea de comandos o algo que dependa del destino.
Falta un archivo cuando se ejecuta mi acción o mi archivo binario
Asegúrate de que 1) el archivo se haya registrado como entrada para la acción o el archivo binario y 2) la secuencia de comandos o la herramienta que se ejecuta acceda al archivo con la ruta correcta.
Para las acciones, debes declarar las entradas pasándolas a la función ctx.actions.*
que crea la acción. La ruta de acceso correcta para el archivo se puede obtener con File.path
.
En el caso de los archivos binarios (las salidas ejecutables que se ejecutan con un comando bazel run
o bazel test
), debes declarar las entradas incluyéndolas en los runfiles. En lugar de usar el campo path
, usa File.short_path
, que es la ruta de acceso del archivo relativa al directorio de archivos ejecutables en el que se ejecuta el archivo binario.
¿Cómo puedo controlar qué archivos compila bazel build //pkg:mytarget
?
Usa el proveedor DefaultInfo
para establecer los resultados predeterminados.
¿Cómo puedo ejecutar un programa o realizar E/S de archivos como parte de mi compilación?
Una herramienta se puede declarar como un destino, al igual que cualquier otra parte de tu compilación, y se puede ejecutar durante la fase de ejecución para ayudar a compilar otros destinos. Para crear una acción que ejecute una herramienta, usa ctx.actions.run
y pasa la herramienta como el parámetro executable
.
Durante las fases de carga y análisis, una herramienta no puede ejecutarse, ni puedes realizar E/S de archivos. Esto significa que las herramientas y el contenido de los archivos (excepto el contenido de los archivos BUILD y .bzl) no pueden afectar la forma en que se crean los gráficos de acciones y destinos.
¿Qué sucede si necesito acceder a los mismos datos estructurados antes y durante la fase de ejecución?
Puedes darle formato a los datos estructurados como un archivo .bzl. Puedes load()
el archivo para acceder a él durante las fases de carga y análisis. Puedes pasarlo como un archivo de entrada o de ejecución a las acciones y los ejecutables que lo necesiten durante la fase de ejecución.
¿Cómo debo documentar el código de Starlark?
En el caso de las reglas y los atributos de reglas, puedes pasar un literal de cadena de documentación (posiblemente entre comillas triples) al parámetro doc
de rule
o attr.*()
. Para las funciones y macros auxiliares, usa un literal de cadena de documentación entre comillas triples que siga el formato que se indica aquí.
Por lo general, las funciones de implementación de reglas no necesitan su propia cadena de documentación.
El uso de literales de cadena en los lugares esperados facilita que las herramientas automatizadas extraigan la documentación. Puedes usar comentarios estándar que no sean de cadena en cualquier lugar donde puedan ayudar al lector de tu código.