Contenido
paquete
package(default_deprecation, default_package_metadata, default_testonly, default_visibility, features)
Esta función declara metadatos que se aplican a cada regla del paquete. Se usa como máximo una vez dentro de un paquete (archivo BUILD).
Para el equivalente que declara los metadatos que se aplican a todas las reglas
repositorio, usa la función repo()
en
Archivo REPO.bazel
en la raíz de tu repositorio.
La función repo()
toma exactamente los mismos argumentos que package()
.
Se debe llamar a la función package() justo después de todas las sentencias load() en la parte superior del archivo, antes de cualquier regla.
Argumentos
Atributo | Descripción |
---|---|
default_applicable_licenses |
Alias de |
default_visibility |
Es una lista de etiquetas. El valor predeterminado es La visibilidad predeterminada de las reglas en este paquete. Cada regla de este paquete tiene la visibilidad especificada en este atributo, a menos que se especifique lo contrario en el atributo |
default_deprecation |
String; el valor predeterminado es Establece el predeterminado
Mensaje |
default_package_metadata |
Lista de etiquetas; el valor predeterminado es Establece una lista predeterminada de destinos de metadatos que se aplican a todos los demás destinos del paquete. Por lo general, se trata de objetivos relacionados con las declaraciones de paquetes y licencias de OSS. Consulta rules_license para ver ejemplos. |
default_testonly |
Booleano; el valor predeterminado es Establece la propiedad En los paquetes de |
features |
Enumera strings. el valor predeterminado es Configura varias marcas que afectan la semántica de este archivo Build. Esta función es utilizada principalmente por las personas que trabajan en el sistema de compilación para etiqueta paquetes que necesitan algún tipo de manejo especial. No lo uses a menos que alguien que trabaje en el sistema de compilación lo solicite de forma explícita. |
Ejemplos
En la siguiente declaración, se indica que las reglas de este paquete solo son visibles para los miembros del grupo de paquetes//foo:target
. Si están presentes, las declaraciones de visibilidad individuales en una regla anula esta especificación.
package(default_visibility = ["//foo:target"])
package_group
package_group(name, packages, includes)
Esta función define un conjunto de paquetes y asocia una etiqueta con el conjunto. Se puede hacer referencia a la etiqueta en los atributos visibility
.
Los grupos de paquetes se usan principalmente para el control de visibilidad. Es visible para el público destino desde cada paquete del árbol del código fuente. Solo se puede hacer referencia a un objetivo visible de forma privada dentro de su propio paquete (no en subpaquetes). Entre estos extremos, un objetivo puede permitir el acceso a su propio paquete, además de cualquiera de los paquetes que describen uno o más grupos de paquetes. Para obtener una explicación más detallada del sistema de visibilidad, consulta el atributo visibility.
Se considera que un paquete determinado está en el grupo si coincide con el atributo packages
o ya está contenido en uno de los otros grupos de paquetes mencionados en el atributo includes
.
Técnicamente, los grupos de paquetes son objetivos, pero no se crean por reglas y no y no tienen protección de visibilidad.
Argumentos
Atributo | Descripción |
---|---|
name |
Nombre: obligatorio. Un nombre único para este destino. |
packages |
Es una lista de cadenas. El valor predeterminado es Una lista de cero o más especificaciones del paquete. Cada cadena de especificación del paquete puede tener uno de los siguientes valores Formularios:
Además, los dos primeros tipos de especificaciones de paquete también pueden
tener el prefijo El grupo de paquetes contiene cualquier paquete que coincida con al menos uno de
sus especificaciones positivas y ninguna de sus especificaciones negativas
Por ejemplo, el valor Además de la visibilidad pública, no hay forma de especificar directamente fuera del repositorio actual. Si falta este atributo, es lo mismo que establecerlo en un
lista vacía, que también es lo mismo que configurarla en una lista que contiene
solo Nota: Antes de Bazel 6.0, la especificación Nota: Antes de Bazel 6.0, este atributo se serializaba como
parte de |
includes |
Es una lista de etiquetas. El valor predeterminado es Otros grupos de paquetes que se incluyen en este. Las etiquetas de este atributo deben hacer referencia a otros grupos de paquetes.
Los paquetes de los grupos de paquetes a los que se hace referencia se consideran parte de este
grupo de paquetes. Es transitivo; si el grupo de paquetes
Cuando se usa junto con especificaciones de paquetes negadas, ten en cuenta que el conjunto de paquetes para cada grupo se calcula de forma independiente y, luego, los resultados se unen. Esto significa que los objetivos las especificaciones de un grupo no tienen ningún efecto en las especificaciones de con otro grupo. |
Ejemplos
En la siguiente declaración package_group
, se especifica un
Grupo de paquetes llamado “tropical” que contiene frutas tropicales.
package_group( name = "tropical", packages = [ "//fruits/mango", "//fruits/orange", "//fruits/papaya/...", ], )
Las siguientes declaraciones especifican los grupos de paquetes de un aplicación:
package_group( name = "fooapp", includes = [ ":controller", ":model", ":view", ], ) package_group( name = "model", packages = ["//fooapp/database"], ) package_group( name = "view", packages = [ "//fooapp/swingui", "//fooapp/webui", ], ) package_group( name = "controller", packages = ["//fooapp/algorithm"], )
exports_files
exports_files([label, ...], visibility, licenses)
exports_files()
especifica una lista de archivos que pertenecen a
este paquete que se exportan a otros paquetes.
El archivo BUILD de un paquete solo puede hacer referencia directamente a archivos de origen que pertenecen a otro paquete si se exportan de forma explícita con una sentencia exports_files()
. Más información sobre
visibilidad de los archivos.
Como comportamiento heredado, los archivos mencionados como entrada de una regla también se exportan con la visibilidad predeterminada hasta que se invierte la marca --incompatible_no_implicit_file_export
. Sin embargo, este comportamiento no se debe confiar ni activamente
desde donde se migraron.
Argumentos
El argumento es una lista de nombres de archivos dentro del paquete actual. R
También puedes especificar la declaración de visibilidad. en este caso, los archivos serán
visibles para los destinos especificados. Si no se especifica ninguna visibilidad, todos los paquetes podrán ver los archivos, incluso si se especificó una visibilidad predeterminada del paquete en la función package
. Las licencias
también se pueden especificar.
Ejemplo
En el siguiente ejemplo, se exporta golden.txt
, un
archivo de texto del paquete test_data
, de modo que otros
paquetes lo pueden usar, por ejemplo, en el atributo data
de pruebas.
# from //test_data/BUILD exports_files(["golden.txt"])
glob
glob(include, exclude=[], exclude_directories=1, allow_empty=True)
Glob es una función auxiliar que encuentra todos los archivos que coinciden con ciertos patrones de ruta y muestra una lista nueva, mutable y ordenada de sus rutas. Glob solo busca archivos en su propio paquete y solo busca archivos de origen (no archivos generados ni otros destinos).
La etiqueta de un archivo fuente se incluye en el resultado si la ruta de acceso del paquete del archivo coincide con cualquiera de los patrones include
y ninguno de los patrones exclude
.
Las listas include
y exclude
contienen patrones de ruta de acceso.
que están relacionadas con el paquete actual. Cada patrón puede constar de uno o más segmentos de ruta. Como de costumbre con las rutas de Unix, estos segmentos están separados por /
. Los segmentos pueden contener el comodín *
: este coincide
cualquier subcadena en el segmento de la ruta de acceso (incluso la subcadena vacía), sin incluir
separador de directorio /
. Este comodín se puede usar varias veces
dentro de un segmento de ruta. Además, el comodín **
puede coincidir con cero o más segmentos de ruta de acceso completos, pero se debe declarar como un segmento de ruta de acceso independiente.
foo/bar.txt
coincide exactamente con el archivofoo/bar.txt
en este paquetefoo/*.txt
coincide con todos los archivos del directoriofoo/
. si el archivo termina con.txt
(a menos quefoo/
sea un subpaquete)foo/a*.htm*
coincide con todos los archivos del directoriofoo/
que comienzan cona
, luego tienen una cadena arbitraria (podría estar vacía), luego tienen.htm
y terminan con otra cadena arbitraria, comofoo/axx.htm
yfoo/a.html
ofoo/axxx.html
.**/a.txt
coincide con cada archivoa.txt
en cada subdirectorio de este paquete**/bar/**/*.txt
coincide con cada archivo.txt
en cada subdirectorio de este paquete, si al menos un directorio en la ruta resultante se llamadabar
, comoxxx/bar/yyy/zzz/a.txt
obar/a.txt
(recuerda que**
también coincide con cero) segmentos) obar/zzz/a.txt
**
coincide con todos los archivos de cada subdirectorio de este paquete.foo**/a.txt
no es un patrón válido, porque**
debe se presentan por sí solos como un segmento
Si el argumento exclude_directories
está habilitado (configurado en 1), los archivos de
de tipo directorio se omitirá de los resultados (valor predeterminado: 1).
Si el argumento allow_empty
se establece en False
, la
La función glob
producirá un error si el resultado fuera el
lista vacía.
Existen varias limitaciones y advertencias importantes:
-
Dado que
glob()
se ejecuta durante la evaluación del archivo BUILD,glob()
solo coincide con los archivos en el árbol de origen, nunca con los archivos generados. Si compilas un destino que requiere archivos fuente y generados, debes adjuntar una lista explícita de archivos generados al glob. Consulta el ejemplo a continuación con:mylib
y:gen_java_srcs
. -
Si una regla tiene el mismo nombre que un archivo de origen coincidente, la regla “sombra” el archivo.
Para comprender esto, recuerda que
glob()
muestra una lista de rutas, por lo que usarglob()
en el atributo de otras reglas (p. ej.,srcs = glob(["*.cc"])
) tiene el mismo efecto que enumerar las rutas coincidentes de forma explícita. Si, por ejemplo,glob()
rinde["Foo.java", "bar/Baz.java"]
, pero también hay una regla en la paquete llamado "Foo.java" (lo cual está permitido, aunque Bazel lo advierte) entonces, el consumidor deglob()
usará el archivo "Foo.java" regla (sus resultados) en lugar de la “Foo.java” . Consulta el problema #10395 de GitHub para obtener más detalles. - Los globs pueden coincidir con los archivos en los subdirectorios. Además, los nombres de los subdirectorios pueden usar comodines. Sin embargo…
-
Las etiquetas no pueden cruzar el límite del paquete, y glob lo hace. no coinciden con los archivos en los subpaquetes.
Por ejemplo, la expresión glob
**/*.cc
en el paquetex
no incluyex/y/z.cc
six/y
existe como paquete (ya sea comox/y/BUILD
o en otro lugar de la ruta del paquete). Esta significa que el resultado de la expresión glob depende del tipo la existencia de archivos BUILD, es decir, la misma expresión glob se incluirx/y/z.cc
si no se llamó a un paquetex/y
o se marcó como eliminado mediante el elemento --deleted_packages marca. - La restricción anterior se aplica a todas las expresiones glob, sin importar qué comodines usen.
-
Un archivo oculto con un nombre que comienza con
.
coincide por completo con los comodines**
y*
. Si quieres hacer coincidir un archivo oculto con un patrón compuesto, este debe comenzar con un.
. Por ejemplo,*
y.*.txt
coincidirán con.foo.txt
, pero*.txt
no. Los directorios ocultos también coinciden de la misma manera. Directorios ocultos pueden incluir archivos que no son necesarios como entradas y pueden aumentar la cantidad innecesaria de archivos globulares y el consumo de memoria. Para excluir directorios ocultos, agrégalos al argumento de la lista "exclude". -
La casilla de verificación "**" comodín tiene una sentencia case: el patrón
"**"
no coincide con la ruta de acceso al directorio del paquete. Es decir, por ejemplo,glob(["**"], exclude_directories = 0)
coincide con todos los archivos y directorios de forma transitiva en el directorio del paquete actual. (pero, por supuesto, no accede a directorios de subpaquetes; consulta la al respecto).
En general, debes intentar proporcionar una extensión adecuada (p. ej., *.html) en lugar de usar un "*" sin formato para un patrón de glob. El nombre más explícito se autodocumenta y garantiza que no coincidas accidentalmente con los archivos de copia de seguridad ni con los archivos de guardado automático de emacs/vi/….
Cuando escribes reglas de compilación, puedes enumerar los elementos del glob. Esto permite generar reglas individuales para cada entrada, por ejemplo. Consulta la sección Ejemplo de glob expandido que aparece a continuación.
Ejemplos de glob
Crea una biblioteca de Java compilada a partir de todos los archivos Java de este directorio y todos los archivos generados por la regla :gen_java_srcs
.
java_library( name = "mylib", srcs = glob(["*.java"]) + [":gen_java_srcs"], deps = "...", ) genrule( name = "gen_java_srcs", outs = [ "Foo.java", "Bar.java", ], ... )
Incluye todos los archivos txt en el directorio testdata, excepto experimental.txt. Ten en cuenta que no se incluirán los archivos de los subdirectorios de testdata. Si quieres que se incluyan esos archivos, usa un comodín recursivo (**).
sh_test( name = "mytest", srcs = ["mytest.sh"], data = glob( ["testdata/*.txt"], exclude = ["testdata/experimental.txt"], ), )
Ejemplos de glob recursiva
Se debe hacer que la prueba dependa de todos los archivos txt del directorio testdata y de cualquier archivo de sus subdirectorios (y sus subdirectorios, etc.). Se ignoran los subdirectorios que contienen un archivo BUILD. (Consulta las limitaciones y advertencias anteriores).
sh_test( name = "mytest", srcs = ["mytest.sh"], data = glob(["testdata/**/*.txt"]), )
Crea una biblioteca compilada a partir de todos los archivos Java de este directorio y de todos excepto aquellos cuya ruta de acceso incluya un directorio llamado "testing". Si es posible, se debe evitar este patrón, ya que puede reducir la cantidad y, por lo tanto, aumentar los tiempos de compilación.
java_library( name = "mylib", srcs = glob( ["**/*.java"], exclude = ["**/testing/**"], ), )
Ejemplos de glob expandido
Crea una genrule individual para *_test.cc en el directorio actual que cuenta el número de líneas del archivo.
# Conveniently, the build language supports list comprehensions. [genrule( name = "count_lines_" + f[:-3], # strip ".cc" srcs = [f], outs = ["%s-linecount.txt" % f[:-3]], cmd = "wc -l $< >$@", ) for f in glob(["*_test.cc"])]
Si el archivo CREAMIENTO anterior está en el paquete //foo y el paquete contiene tres
archivos coincidentes, a_test.cc, b_test.cc y c_test.cc, y luego se ejecutará
bazel query '//foo:all'
mostrará una lista de todas las reglas que se generaron:
$ bazel query '//foo:all' | sort //foo:count_lines_a_test //foo:count_lines_b_test //foo:count_lines_c_test
seleccionar
select( {conditionA: valuesA, conditionB: valuesB, ...}, no_match_error = "custom message" )
select()
es la función auxiliar que crea un atributo de regla.
configurable.
Puede reemplazar el lado derecho de
casi
cualquier asignación de atributos, por lo que su valor depende de las marcas de Bazel de la línea de comandos
Puedes usar esto, por ejemplo, para definir dependencias específicas de la plataforma o para incorporar diferentes recursos según si una regla se compila en el modo "desarrollador" o "versión".
El uso básico es el siguiente:
sh_binary( name = "mytarget", srcs = select({ ":conditionA": ["mytarget_a.sh"], ":conditionB": ["mytarget_b.sh"], "//conditions:default": ["mytarget_default.sh"] }) )
Esto hace que el atributo srcs
de un sh_binary
sea configurable reemplazando su asignación normal de lista de etiquetas por una llamada a select
que asigna condiciones de configuración a valores coincidentes. Cada condición es una etiqueta
que hace referencia a
un config_setting
o
constraint_value
,
que "coincide" si la configuración del objetivo coincide con un conjunto esperado de
valores. Luego, el valor de mytarget#srcs
se convierte en la lista de etiquetas que coincida con la invocación actual.
Notas:
- Se seleccionó exactamente una condición en cualquier invocación.
- Si coinciden varias condiciones y una es una especialización de las demás, la especialización tiene prioridad. La condición B se considera una especialización de la condición A si B tiene las mismas marcas y valores de restricción que A, además de algunas marcas o valores de restricción adicionales. Esto también significa que la resolución de especialización no está diseñada para crear un orden, como se muestra en el ejemplo 2 a continuación.
- Si coinciden varias condiciones y una no es una especialización de todas las demás, Bazel falla con un error, a menos que todas las condiciones se resuelvan en el mismo valor.
- La seudoetiqueta especial
//conditions:default
es considera como coincidencia si no coincide ninguna otra condición. Si esta condición se excluya, alguna otra regla debe coincidir para evitar errores. select
se puede incorporar dentro de una asignación de atributos. Por lo tanto,srcs = ["common.sh"] + select({ ":conditionA": ["myrule_a.sh"], ...})
ysrcs = select({ ":conditionA": ["a.sh"]}) + select({ ":conditionB": ["b.sh"]})
son expresiones válidas.select
funciona con la mayoría de los atributos, pero no con todos. Incompatibles están marcados comononconfigurable
en su documentación.subpaquetes
subpackages(include, exclude=[], allow_empty=True)
subpackages()
es una función auxiliar, similar aglob()
, que enumera subpaquetes en lugar de archivos y directorios. Usa los mismos patrones de ruta de acceso queglob()
y puede coincidir con cualquier subpaquete que sea descendiente directo del archivo BUILD que se está cargando actualmente. Consulta glob para obtener una explicación detallada y ejemplos de include y excluir patrones.La lista resultante de subpaquetes mostrados está en orden y contiene rutas de acceso relativas al paquete de carga actual que coincidan con los patrones dados en
include
y no enexclude
.Ejemplo
En el siguiente ejemplo, se enumeran todos los subpaquetes directos del paquete
foo/BUILD
# The following BUILD files exist: # foo/BUILD # foo/bar/baz/BUILD # foo/sub/BUILD # foo/sub/deeper/BUILD # # In foo/BUILD a call to subs = subpackages(include = ["**"]) # results in subs == ["sub", "bar/baz"] # # 'sub/deeper' is not included because it is a subpackage of 'foo/sub' not of # 'foo'
En general, se prefiere que, en lugar de llamar a esta función directamente que los usuarios utilicen los "subpaquetes" módulo de skylib.