Lugares de trabajo, paquetes y destinos

Informar un problema Ver fuente . Por la noche · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

Bazel compila software a partir de código fuente organizado en un árbol de directorios llamado un espacio de trabajo. Los archivos de origen en el espacio de trabajo se organizan 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é y las salidas de software 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 dependencias externas 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 lugar 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 existen ambos archivos, se usa 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 lugar de trabajo.

Las reglas de Workspace agrupadas con Bazel se documentan en el en la sección Reglas de Workspace Build Encyclopedia y la documentación sobre reglas de repositorio de Starlark incorporadas.

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 se agregan automáticamente.

Paquetes

La unidad principal de organización de código en un repositorio es el paquete. R es una colección de archivos relacionados y una especificación de cómo 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 en su directorio, más a todos los subdirectorios, excepto los que contengan una BUILD. Según esta definición, ningún archivo o directorio puede ser 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 pertenecen 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. Los archivos fuente, por lo general, son escrito por el esfuerzo de las personas y registrado en el repositorio. Los archivos generados, a veces llamados archivos derivados o archivos de salida, no se registran, pero se generan a partir de archivos fuente.

El segundo tipo de objetivo se declara con una regla. Cada regla especifica la relación entre un conjunto de entrada y un conjunto archivos de salida. Las entradas de una regla pueden ser archivos de origen, pero también puede ser el resultado de otras reglas.

Si la entrada a una regla es un archivo de origen o un archivo generado en la mayoría de los casos, irrelevantes; lo que importa es solo su contenido . Esto facilita el reemplazo de un archivo fuente complejo con un archivo generado por una regla, como ocurre cuando la carga de mantener manualmente un archivo altamente estructurado tedioso y alguien escribe un programa para derivarla. Ningún cambio es que se solicita a los consumidores de ese archivo. Por el contrario, un archivo generado pueden reemplazarse fácilmente por un archivo fuente con solo cambios.

Las entradas a una regla también pueden incluir otras reglas. El el significado preciso de estas relaciones suele ser bastante complejo y depende del lenguaje o de reglas, pero intuitivamente es simple: un código la regla A de la biblioteca podría tener otra regla B de la biblioteca C++ para una entrada. El efecto de esta dependencia es que los archivos de encabezado de B disponible para A durante la compilación, los símbolos de B están disponibles para A para A durante la vinculación, y los datos del tiempo de ejecución de B están disponibles para A durante ejecución.

Una invariante de todas las reglas es que los archivos que genera una regla pertenecerán siempre al mismo paquete que la regla misma; no es posible generar archivos en otro paquete. No es poco común para 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 incluyan. Las únicas formas permitidas para referirse a ellos son desde el atributo visibility de las reglas o desde default_visibility atributo de la función package; no generan ni consumen archivos. Para obtener más información, consulta la Documentación de package_group

Etiquetas