Preguntas frecuentes

Estos son algunos problemas y preguntas habituales relacionados con la escritura de extensiones.

¿Por qué no se genera mi archivo o mi acción nunca se ejecuta?

Bazel solo ejecuta las acciones necesarias para producir los archivos de salida solicitados.

  • Si el archivo que deseas tiene una etiqueta, puedes solicitarla 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 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 mencione tu destino en la línea de comandos, agrégalo a los resultados predeterminados de la regla. Para ello, muestra un proveedor de 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 destino en la línea de comandos o algo que dependa de él.

Falta un archivo cuando se ejecuta mi acción o objeto binario

Asegúrate de que 1) el archivo se haya registrado como una entrada a la acción o el objeto binario y que 2) la secuencia de comandos o la herramienta que se ejecuta acceda al archivo por medio de la ruta de acceso 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 adecuada para el archivo se puede obtener con File.path.

En el caso de los objetos binarios (los resultados ejecutables que se ejecutan mediante un comando bazel run o bazel test), debes declarar las entradas a través de su inclusión en los archivos de ejecución. En lugar de usar el campo path, usa File.short_path, que es la ruta del archivo en relación con el directorio de runfiles en el que se ejecuta el objeto binario.

¿Cómo puedo controlar los archivos que compila bazel build //pkg:mytarget?

Usa el proveedor DefaultInfo para establecer los resultados predeterminados.

¿Cómo puedo ejecutar un programa o realizar operaciones de E/S de archivos como parte de mi compilación?

Una herramienta se puede declarar como destino, al igual que cualquier otra parte de tu 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 pásala 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 destino y acción.

¿Qué sucede si necesito acceder a los mismos datos estructurados antes y durante la fase de ejecución?

Puedes darles 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?

Para 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 auxiliares y las macros, usa un literal de docstring con comillas triples siguiendo 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 string en los lugares esperados facilita que las herramientas automáticas extraigan documentación. Puedes usar comentarios estándar que no sean de cadena siempre que sean útiles para el lector de tu código.