Estos son algunos problemas y preguntas comunes sobre la escritura de extensiones.
¿Por qué no se produce mi archivo o nunca se ejecuta mi acción?
Bazel solo ejecuta las acciones necesarias para producir los archivos de salida solicitados.
Si el archivo que deseas tiene una etiqueta, puedes solicitarlo directamente:
bazel build //pkg:myfile.txtSi el archivo está 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=fooSi deseas que el archivo se compile automáticamente cada vez que se mencione tu destino en la línea de comandos, agrégalo a las salidas predeterminadas de tu regla devolviendo un
DefaultInfoproveedor.
Consulta la página 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 de él.
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 objeto binario y 2) la secuencia de comandos o la herramienta que se ejecuta acceda al archivo con la ruta de acceso correcta.
Para las acciones, declaras las entradas pasándolas a la función ctx.actions.* que crea la acción. La ruta correcta para el archivo se puede obtener con
File.path.
Para los archivos binarios (las salidas ejecutables que ejecuta un bazel run o bazel test
comando), declaras 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 en relación con
el directorio de archivos de ejecución en el que se ejecuta el objeto binario.
¿Cómo puedo controlar qué archivos compila bazel build //pkg:mytarget?
Usa el proveedor DefaultInfo para
establecer las salidas predeterminadas.
¿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 tampoco 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 destino y acción.
¿Qué sucede si necesito acceder a los mismos datos estructurados antes y durante la fase de ejecución?
Puedes dar 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 una entrada o un archivo de ejecución a acciones y ejecutables que lo necesiten durante la fase de ejecución.
¿Cómo debo documentar el código de Starlark?
Para 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 auxiliares
y las macros, usa un literal de cadena de documentación entre comillas triples con 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 la extracción de documentación de herramientas automatizadas. No dudes en usar comentarios estándar que no sean de cadena donde pueda ayudar al lector de tu código.