Estos son algunos problemas y preguntas comunes relacionados con las extensiones de escritura.
¿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 quieres tiene una etiqueta, puedes solicitarlo directamente:
bazel build //pkg:myfile.txt
Si 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=foo
Si deseas que el archivo se compile automáticamente cada vez que se menciona tu objetivo en la línea de comandos, agrégalo a las salidas predeterminadas de tu regla. Para ello, muestra un proveedor
DefaultInfo
.
Consulta la página Reglas para obtener más información.
¿Por qué no se ejecuta mi función de implementación?
Bazel solo analiza los destinos que se solicitan para la compilación. Debes asignar un nombre al objetivo en la línea de comandos o algo que dependa del objetivo.
Falta un archivo cuando se ejecuta mi acción o mi objeto binario
Asegúrate de que 1) el archivo se haya registrado como entrada a la acción o al objeto binario y 2) que la secuencia de comandos o la herramienta que se ejecuta acceda al archivo con la ruta correcta.
En el caso de las acciones, debes declarar las entradas pasándolas a la función ctx.actions.*
que crea la acción. La ruta de acceso correcta del archivo se puede obtener con File.path
.
En el caso de los objetos binarios (los resultados ejecutables que ejecuta un comando bazel run
o bazel test
), puedes declarar las entradas si las incluyes 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 runfiles en el que se ejecuta el objeto binario.
¿Cómo puedo controlar qué archivos compila bazel build //pkg:mytarget
?
Usa el proveedor DefaultInfo
para configurar 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 la compilación, y ejecutarse 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, no se puede ejecutar una herramienta ni realizar operaciones de 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 entrada o archivo 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 docstring (posiblemente con comillas triples) al parámetro doc
de rule
o attr.*()
. Para las funciones y macros auxiliares, usa una cadena literal de docstring con comillas triples que siga el formato que se indica aquí.
Por lo general, las funciones de implementación de reglas no necesitan su propia docstring.
El uso de literales de cadena en los lugares esperados facilita que las herramientas automáticas extraigan la documentación. No dudes en usar comentarios estándar que no sean de cadenas cuando sea necesario para ayudar al lector de tu código.