Bazel compila software a partir del código fuente organizado en árboles de directorios llamados repositorios. Un conjunto definido de repositorios comprende el espacio de trabajo. Los archivos fuente de los repositorios se organizan en una jerarquía anidada de paquetes, en la que cada paquete es un directorio que contiene un conjunto de archivos fuente relacionados y un archivo BUILD. El archivo BUILD especifica qué salidas de software se pueden compilar a partir de la fuente.
Repositorios
Los archivos fuente que se usan en una compilación de Bazel se organizan en repositorios (a menudo abreviados como repos). Un repositorio es un árbol de directorios con un archivo de marcador de límite en
su raíz. Este archivo de marcador de límite podría ser MODULE.bazel, REPO.bazel o
en contextos heredados, WORKSPACE o WORKSPACE.bazel.
El repositorio en el que se ejecuta el comando Bazel actual se denomina repositorio principal. Otros repositorios (externos) se definen mediante reglas de repositorio. Consulta la descripción general de las dependencias externas para obtener más información.
Workspace
Un espacio de trabajo es el entorno compartido por todos los comandos de Bazel que se ejecutan desde el mismo repositorio principal. Abarca el repositorio principal y el conjunto de todos los repositorios externos definidos.
Ten en cuenta que, históricamente, los conceptos de "repositorio" y "espacio de trabajo" se han combinado. El término "espacio de trabajo" se usó con frecuencia para hacer referencia al repositorio principal y, a veces, incluso como sinónimo de "repositorio".
Paquetes
La unidad principal de organización de código en un repositorio es el paquete. Un paquete es una colección de archivos relacionados y una especificación de cómo se pueden usar para producir artefactos de salida.
Un paquete se define como un directorio que contiene un
BUILD archivo llamado BUILD o BUILD.bazel. Un paquete incluye todos los archivos de su directorio, además de todos los subdirectorios que se encuentran debajo, excepto aquellos que contienen un archivo BUILD. A partir de esta definición, ningún archivo o directorio puede formar parte de dos paquetes diferentes.
Por ejemplo, en el siguiente árbol de directorios, hay dos paquetes, my/app,
y el subpaquete my/app/tests. Ten en cuenta que my/app/data no es un paquete, sino
un directorio que pertenece al paquete my/app.
src/my/app/BUILD
src/my/app/app.cc
src/my/app/data/input.txt
src/my/app/tests/BUILD
src/my/app/tests/test.cc
Destinos
Un paquete es un contenedor de destinos, que se definen en el archivo
BUILD del paquete. La mayoría de los destinos son de dos tipos principales: archivos y reglas.
Los archivos se dividen en dos tipos. Por lo general, los archivos fuente se escriben con el esfuerzo de las personas y se registran en el repositorio. Archivos generados, a veces llamados archivos derivados o archivos de salida, no se registran, sino que se generan a partir de archivos fuente.
El segundo tipo de destino se declara con una regla. Cada instancia de regla especifica la relación entre un conjunto de archivos de entrada y un conjunto de archivos de salida. Las entradas de una regla pueden ser archivos fuente, pero también pueden ser las salidas de otras reglas.
En la mayoría de los casos, no importa si la entrada de una regla es un archivo fuente o un archivo generado. Lo que importa es solo el contenido de ese archivo. Este hecho facilita el reemplazo de un archivo fuente complejo por un archivo generado por una regla, como sucede cuando la carga de mantener manualmente un archivo altamente estructurado se vuelve demasiado agotadora y alguien escribe un programa para derivarlo. No se requiere ningún cambio para los consumidores de ese archivo. Por el contrario, un archivo generado se puede reemplazar fácilmente por un archivo fuente con solo cambios locales.
Las entradas de una regla también pueden incluir otras reglas. El significado preciso de estas relaciones suele ser bastante complejo y depende del lenguaje o de la regla, pero, de forma intuitiva, es simple: una regla A de biblioteca de C++ podría tener otra regla B de biblioteca de C++ para una entrada. El efecto de esta dependencia es que los archivos de encabezado de B están disponibles para A durante la compilación, los símbolos de B están disponibles para A durante la vinculación y los datos de tiempo de ejecución de B están disponibles para A durante la ejecución.
Una invariante de todas las reglas es que los archivos generados por una regla siempre pertenecen al mismo paquete que la regla en sí. No es posible generar archivos en otro paquete. Sin embargo, no es raro que las entradas de una regla provengan de otro paquete.
Los grupos de paquetes son conjuntos de paquetes cuyo propósito es limitar la accesibilidad de ciertas reglas. Los grupos de paquetes se definen con la función package_group. Tienen tres propiedades: la lista de paquetes que contienen, su nombre y otros grupos de paquetes que incluyen. Las únicas formas permitidas de hacer referencia a ellos son desde el
visibility atributo de las reglas o desde el default_visibility atributo de
la package función. No generan ni consumen archivos. Para obtener más
información, consulta la package_group
documentación.