Bazel compila software a partir de código fuente organizado en un árbol de directorios llamado
Workspace. Los archivos fuente en el espacio de trabajo se organizan
en una jerarquía anidada de
paquetes, en los que cada paquete es un directorio que contiene un conjunto de
archivos fuente y un archivo BUILD
. El archivo BUILD
especifica el software
y los resultados se pueden compilar a partir de la fuente.
Lugar de trabajo
Un lugar de trabajo es un árbol de directorios de tu sistema de archivos que contiene el código fuente.
para el software que deseas compilar. Cada espacio de trabajo tiene un archivo de texto llamado
WORKSPACE
, que puede estar vacío o contener referencias a aplicaciones externas
dependencias necesarias para compilar los resultados.
Los directorios que contienen un archivo llamado WORKSPACE
se consideran la raíz de un
Workspace. Por lo tanto, Bazel ignora los árboles de directorios en un espacio de trabajo con permisos de administrador en
un subdirectorio que contiene un archivo WORKSPACE
, ya que forman otro espacio de trabajo.
Bazel también admite el archivo WORKSPACE.bazel
como alias del archivo WORKSPACE
. Si
ambos archivos existen, se usará WORKSPACE.bazel
.
Repositorios
El código se organiza en repositorios. El directorio que contiene WORKSPACE
es la raíz del repositorio principal, también llamado @
. Otro (externo)
los repositorios se definen en el archivo WORKSPACE
con las reglas del espacio de trabajo.
generados a partir de módulos y extensiones del sistema Bzlmod. Consulta los recursos
Descripción general de las dependencias para obtener más información.
Las reglas del espacio de trabajo agrupadas con Bazel se documentan en la sección Espacio de trabajo Reglas en Compilación Enciclopedia y la documentación sobre elementos incorporados Reglas del repositorio de Starlark.
Como los repositorios externos son repositorios, suelen contener un
WORKSPACE
. Sin embargo, estos WORKSPACE
archivos adicionales no son
que Bazel ignoraba. En particular, los repositorios que dependen transitivamente no son
se agregan automáticamente.
Paquetes
La unidad principal de organización de código en un repositorio es el paquete. R paquete es una colección de archivos relacionados y una especificación de cómo se pueden que se usa para producir artefactos de salida.
Un paquete se define como un directorio que contiene un archivo llamado BUILD
(o
BUILD.bazel
). Un paquete incluye todos los archivos de su directorio, más todos
subdirectorios, excepto los que contienen un archivo BUILD
.
Según esta definición, ningún archivo o directorio puede ser parte de dos
paquetes.
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,
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 la interfaz del
Archivo BUILD
. La mayoría de los destinos son uno de los dos tipos principales: archivos y reglas.
Los archivos se dividen aún más en dos tipos. En general, los archivos de origen los escribe los esfuerzos de las personas y se registraron en el repositorio. Archivos generados, denominados archivos derivados o archivos de salida, no se registran, pero generados a partir de archivos fuente.
El segundo tipo de objetivo se declara con una regla. Cada instancia de la regla especifica la relación entre un conjunto de archivos de entrada y uno de salida. El Las entradas de una regla pueden ser archivos de origen, pero también pueden ser la salida de otras las reglas de firewall.
Si la entrada a una regla es un archivo de origen o un archivo generado está en la mayoría casos irrelevantes; lo que importa es solo el contenido de ese archivo. Este dato facilita el reemplazo de un archivo fuente complejo con un archivo generado producido por una regla, como cuando la carga de mantener manualmente un archivo estructurado se vuelve demasiado tedioso 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 pueden reemplazarse fácilmente por un archivo fuente con solo cambios locales.
Las entradas a una regla también pueden incluir otras reglas. El significado preciso de estas son bastante complejas y dependen del idioma o de las reglas, pero intuitivamente es simple: una regla A de la biblioteca C++ podría tener otra biblioteca C++ regla B para una entrada. El efecto de esta dependencia es que los archivos de encabezado de B disponibles para A durante la compilación, los símbolos de B están disponibles para A durante la vinculación, y los datos del 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 que genera una regla siempre pertenecen a el mismo paquete que la regla misma; no es posible generar archivos en otro paquete. No es raro que las entradas de una regla provengan de otra de imágenes, sin embargo.
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
. Ellas
tienen tres propiedades: la lista de paquetes que contienen, su nombre y otras
grupos de paquetes que incluyen. Las únicas formas permitidas para referirse a ellos son desde el
el atributo visibility
de las reglas o desde el atributo default_visibility
de
la función package
no generan ni consumen archivos. Para ver más
consulta la package_group
documentación.