Definiciones comunes

Informar un problema Ver la fuente Nightly · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

En esta sección, se definen varios términos y conceptos que son comunes a muchas funciones o reglas de compilación.

Contenido

Tokenización de Bourne shell

Algunos atributos de cadena de ciertas reglas se dividen en varias palabras según las reglas de tokenización de Bourne Shell: los espacios sin comillas delimitan palabras separadas, y los caracteres de comillas simples y dobles, y las barras inversas se usan para evitar la tokenización.

Los atributos sujetos a esta tokenización se indican explícitamente como tales en sus definiciones en este documento.

Los atributos sujetos a la expansión de la variable "Make" y a la tokenización de Bourne shell se suelen usar para pasar opciones arbitrarias a compiladores y otras herramientas. cc_library.copts y java_library.javacopts son ejemplos de tales atributos. En conjunto, estas sustituciones permiten que una sola variable de cadena se expanda en una lista de palabras de opciones específicas de la configuración.

Expansión de etiquetas

Algunos atributos de cadena de muy pocas reglas están sujetos a la expansión de etiquetas: si esas cadenas contienen una etiqueta válida como subcadena, como //mypkg:target, y esa etiqueta es un requisito previo declarado de la regla actual, se expande al nombre de ruta de acceso del archivo representado por el destino //mypkg:target.

Algunos ejemplos de atributos son genrule.cmd y cc_binary.linkopts. Los detalles pueden variar significativamente en cada caso, en relación con temas como si se expanden las etiquetas relativas, cómo se tratan las etiquetas que se expanden a varios archivos, etcétera. Consulta la documentación del atributo de regla para obtener detalles específicos.

Atributos típicos definidos por la mayoría de las reglas de compilación

En esta sección, se describen los atributos que definen muchas reglas de compilación, pero no todas.

Atributo Descripción
data

Lista de etiquetas. El valor predeterminado es [].

Son los archivos que necesita esta regla durante el tiempo de ejecución. Puede enumerar los destinos de archivos o reglas. Por lo general, permite cualquier objetivo.

Los runfiles y los resultados predeterminados de los destinos en el atributo data deben aparecer en el área *.runfiles de cualquier ejecutable que genere este destino o que tenga una dependencia de tiempo de ejecución en él. Esto puede incluir archivos de datos o archivos binarios que se usan cuando se ejecutan los srcs de este destino. Consulta la sección sobre dependencias de datos para obtener más información sobre cómo depender de archivos de datos y usarlos.

Las reglas nuevas deben definir un atributo data si procesan entradas que podrían usar otras entradas durante el tiempo de ejecución. Las funciones de implementación de reglas también deben completar los archivos ejecutables del destino a partir de los resultados y los archivos ejecutables de cualquier atributo data, así como los archivos ejecutables de cualquier atributo de dependencia que proporcione código fuente o dependencias de tiempo de ejecución.

deps

Lista de etiquetas. El valor predeterminado es [].

Son las dependencias de este destino. En general, solo debe enumerar los destinos de las reglas. (Aunque algunas reglas permiten que los archivos se muestren directamente en deps, esto se debe evitar cuando sea posible).

Por lo general, las reglas específicas del idioma limitan los objetivos enumerados a aquellos con proveedores específicos.

La semántica precisa de lo que significa que un destino dependa de otro con deps es específica del tipo de regla, y la documentación específica de la regla profundiza en este tema. Para las reglas que procesan código fuente, deps generalmente especifica las dependencias de código que usa el código en srcs.

Por lo general, se usa una dependencia deps para permitir que un módulo use símbolos definidos en otro módulo escrito en el mismo lenguaje de programación y compilado por separado. En muchos casos, también se permiten las dependencias entre lenguajes. Por ejemplo, un destino java_library puede depender de código en C++ en un destino cc_library si se incluye este último en el atributo deps. Consulta la definición de dependencias para obtener más información.

licenses

Lista de cadenas; no configurable; el valor predeterminado es ["none"]

Es una lista de cadenas de tipo de licencia que se usarán para este objetivo en particular. Esta es parte de una API de licencias obsoleta que Bazel ya no usa. No uses esta opción.

srcs

Lista de etiquetas. El valor predeterminado es [].

Son los archivos que procesa o incluye esta regla. Por lo general, enumera los archivos directamente, pero puede enumerar los destinos de las reglas (como filegroup o genrule) para incluir sus resultados predeterminados.

Las reglas específicas del idioma suelen requerir que los archivos enumerados tengan extensiones de archivo particulares.

Atributos comunes a todas las reglas de compilación

En esta sección, se describen los atributos que se agregan de forma implícita a todas las reglas de compilación.

Atributo Descripción
aspect_hints

Lista de etiquetas. El valor predeterminado es [].

Es una lista de etiquetas arbitrarias que se exponen a los aspectos (en particular, a los aspectos invocados por las dependencias inversas de esta regla), pero no se exponen a la implementación propia de esta regla. Consulta la documentación de los conjuntos de reglas específicos del idioma para obtener detalles sobre el efecto que tendría una sugerencia de aspecto en particular.

Puedes considerar una sugerencia de aspecto como una alternativa más completa a una etiqueta: mientras que una etiqueta transmite solo un estado booleano (la etiqueta está presente o ausente en la lista de tags), una sugerencia de aspecto puede transmitir información estructurada arbitraria en sus proveedores.

En la práctica, las sugerencias de aspecto se usan para la interoperabilidad entre diferentes conjuntos de reglas específicos del idioma. Por ejemplo, imagina que tienes un destino mylang_binary que debe depender de un destino otherlang_library. La lógica específica de MyLang necesita información adicional sobre el destino OtherLang para poder usarlo, pero otherlang_library no proporciona esta información porque no sabe nada sobre MyLang. Una solución podría ser que el conjunto de reglas de MyLang defina una regla mylang_hint que se pueda usar para codificar esa información adicional. El usuario puede agregar la sugerencia a la aspect_hints de su otherlang_library, y mylang_binary puede usar un aspecto para recopilar la información adicional de un proveedor específico de MyLang en mylang_hint.

Para ver un ejemplo concreto, consulta swift_interop_hint y swift_overlay en rules_swift.

Prácticas recomendadas:

  • Los destinos que se enumeran en aspect_hints deben ser ligeros y mínimos.
  • La lógica específica del idioma solo debe tener en cuenta las sugerencias de aspectos que tengan proveedores relevantes para ese idioma y debe ignorar cualquier otra sugerencia de aspectos.
compatible_with

Lista de etiquetas; no configurable; el valor predeterminado es []

Lista de los entornos para los que se puede compilar este destino, además de los entornos compatibles predeterminados.

Esto forma parte del sistema de restricciones de Bazel, que permite a los usuarios declarar qué destinos pueden depender entre sí y cuáles no. Por ejemplo, los archivos binarios que se pueden implementar de forma externa no deben depender de bibliotecas con código secreto de la empresa. Consulta ConstraintSemantics para obtener más detalles.

deprecation

Cadena; no configurable; el valor predeterminado es None

Es un mensaje de advertencia explicativo asociado a este objetivo. Por lo general, se usa para notificar a los usuarios que un destino quedó obsoleto, que otra regla lo reemplazó, que es privado para un paquete o que, tal vez, se considera dañino por algún motivo. Es una buena idea incluir alguna referencia (como una página web, un número de error o CL de migración de ejemplo) para que se pueda averiguar fácilmente qué cambios se requieren para evitar el mensaje. Si hay un nuevo objetivo que se puede usar como reemplazo directo, es una buena idea migrar a todos los usuarios del objetivo anterior.

Este atributo no afecta la forma en que se compilan los elementos, pero puede afectar el resultado de diagnóstico de una herramienta de compilación. La herramienta de compilación emite una advertencia cuando un destino en otro paquete depende de una regla con un atributo deprecation.

Las dependencias dentro del paquete están exentas de esta advertencia, por lo que, por ejemplo, la compilación de las pruebas de una regla obsoleta no genera una advertencia.

Si un destino en desuso depende de otro destino en desuso, no se emite ningún mensaje de advertencia.

Una vez que las personas dejen de usarlo, se podrá quitar el destino.

exec_compatible_with

Lista de etiquetas; no configurable; el valor predeterminado es []

Es una lista de constraint_values que deben estar presentes en la plataforma de ejecución del grupo de ejecución predeterminado de este destino. Esto se suma a las restricciones que ya establece el tipo de regla. Las restricciones se usan para limitar la lista de plataformas de ejecución disponibles. Para obtener más detalles, consulta la descripción de la resolución de la cadena de herramientas. y grupos de ejecución

exec_group_compatible_with

Diccionario de cadenas para listas de etiquetas; no configurable; el valor predeterminado es {}

Es un diccionario de nombres de grupos de ejecución y listas de constraint_values que deben estar presentes en la plataforma de ejecución para el grupo de ejecución determinado. Esto se suma a las restricciones ya establecidas en la definición del grupo de ejecución. Las restricciones se usan para limitar la lista de plataformas de ejecución disponibles. Para obtener más detalles, consulta la descripción de la resolución de la cadena de herramientas. y grupos de ejecución

exec_properties

Diccionario de cadenas. El valor predeterminado es {}.

Es un diccionario de cadenas que se agregará al exec_properties de una plataforma seleccionada para este objetivo. Consulta exec_properties de la regla plataforma.

Si una clave está presente en las propiedades de la plataforma y del nivel del objetivo, se tomará el valor del objetivo.

Las claves pueden tener como prefijo el nombre de un grupo de ejecución seguido de un . para aplicarlas solo a ese grupo de ejecución en particular.

features

Lista de cadenas de características; el valor predeterminado es []

Una función es una etiqueta de cadena que se puede habilitar o inhabilitar en un destino. El significado de una función depende de la regla en sí.

Este atributo features se combina con el atributo features a nivel del paquete. Por ejemplo, si los atributos ["a", "b"] están habilitados a nivel del paquete y el atributo features de un destino contiene ["-a", "c"], los atributos habilitados para la regla serán "b" y "c". Ver ejemplo.

package_metadata

Lista de etiquetas; no se puede configurar; el valor predeterminado es el default_package_metadata del paquete

Es una lista de etiquetas que son metadatos asociados sobre este destino. Por lo general, las etiquetas son reglas simples que devuelven un proveedor de valores constantes. Las reglas y los aspectos pueden usar estas etiquetas para realizar un análisis adicional en el gráfico de compilación.

El caso de uso canónico es el de rules_license. Para ese caso de uso, se usan package_metadata y default_package_metadata para adjuntar información sobre la licencia o la versión de un paquete a los destinos. Un aspecto aplicado a un binario de nivel superior se puede usar para recopilar esos datos y generar informes de cumplimiento.

restricted_to

Lista de etiquetas; no configurable; el valor predeterminado es []

Lista de los entornos para los que se puede compilar este destino, en lugar de los entornos compatibles predeterminados.

Esto forma parte del sistema de restricciones de Bazel. Consulta compatible_with para obtener más información.

tags

Lista de cadenas; no configurable; el valor predeterminado es []

Las etiquetas se pueden usar en cualquier regla. Las etiquetas en las reglas de prueba y test_suite son útiles para categorizar las pruebas. Las etiquetas en los destinos que no son de prueba se usan para controlar la ejecución en zona de pruebas de las acciones de genrule y Starlark, y para el análisis por parte de personas o herramientas externas.

Bazel modifica el comportamiento de su código de zona de pruebas si encuentra las siguientes palabras clave en el atributo tags de cualquier prueba o destino genrule, o en las claves de execution_requirements para cualquier acción de Starlark.

  • La palabra clave no-sandbox hace que la acción o la prueba nunca se ejecuten en un entorno de pruebas aislado. Se pueden almacenar en caché o ejecutar de forma remota. Usa no-cache o no-remote para evitar cualquiera de esas opciones o ambas.
  • La palabra clave no-cache hace que la acción o la prueba nunca se almacenen en caché (de forma local o remota). Nota: Para los fines de esta etiqueta, la caché de disco se considera una caché local, mientras que las cachés de HTTP y gRPC se consideran remotas. No se ven afectadas otras memorias caché, como Skyframe o la memoria caché de acciones persistentes.
  • La palabra clave no-remote-cache hace que la acción o la prueba nunca se almacenen en caché de forma remota (pero se pueden almacenar en caché de forma local; también se pueden ejecutar de forma remota). Nota: Para los fines de esta etiqueta, la caché de disco se considera una caché local, mientras que las cachés de HTTP y gRPC se consideran remotas. No se ven afectadas otras memorias caché, como Skyframe o la memoria caché de acciones persistentes. Si se usa una combinación de caché de disco local y caché remota (caché combinada), se trata como una caché remota y se inhabilita por completo, a menos que se establezca --incompatible_remote_results_ignore_disk, en cuyo caso se usarán los componentes locales.
  • La palabra clave no-remote-exec hace que la acción o la prueba nunca se ejecuten de forma remota (pero se pueden almacenar en caché de forma remota).
  • La palabra clave no-remote evita que la acción o la prueba se ejecuten de forma remota o se almacenen en caché de forma remota. Esto equivale a usar no-remote-cache y no-remote-exec.
  • La palabra clave no-remote-cache-upload inhabilita la parte de carga del almacenamiento en caché remoto de una generación. No inhabilita la ejecución remota.
  • La palabra clave local impide que la acción o la prueba se almacenen en caché de forma remota, se ejecuten de forma remota o se ejecuten dentro de la zona de pruebas. En el caso de las reglas de generación y las pruebas, marcar la regla con el atributo local = True tiene el mismo efecto.
  • La palabra clave requires-network permite el acceso a la red externa desde la zona de pruebas. Esta etiqueta solo tiene efecto si se habilita el aislamiento de zona de pruebas.
  • La palabra clave block-network bloquea el acceso a la red externa desde la zona de pruebas. En este caso, solo se permite la comunicación con localhost. Esta etiqueta solo tiene efecto si está habilitado el aislamiento de zona de pruebas.
  • requires-fakeroot ejecuta la prueba o la acción como uid y gid 0 (es decir, el usuario raíz). Esta función solo es compatible con Linux. Esta etiqueta tiene prioridad sobre la opción de línea de comandos --sandbox_fake_username.

Las etiquetas en las pruebas se suelen usar para anotar el rol de una prueba en el proceso de depuración y lanzamiento. Por lo general, las etiquetas son más útiles para las pruebas de C++ y Python, que no tienen ninguna capacidad de anotación en el tiempo de ejecución. El uso de etiquetas y elementos de tamaño brinda flexibilidad para ensamblar conjuntos de pruebas basados en la política de registro del código base.

Bazel modifica el comportamiento de ejecución de pruebas si encuentra las siguientes palabras clave en el atributo tags de la regla de prueba:

  • exclusive forzará la ejecución de la prueba en el modo "exclusivo", lo que garantiza que no se ejecuten otras pruebas al mismo tiempo. Estas pruebas se ejecutarán de forma serial después de que se completen todas las actividades de compilación y las pruebas no exclusivas. La ejecución remota está inhabilitada para estas pruebas porque Bazel no tiene control sobre lo que se ejecuta en una máquina remota.
  • exclusive-if-local forzará la ejecución de la prueba en el modo "exclusivo" si se ejecuta de forma local, pero ejecutará la prueba en paralelo si se ejecuta de forma remota.
  • La palabra clave manual excluirá el destino de la expansión de los comodines del patrón de destino (..., :*, :all, etc.) y las reglas de test_suite que no enumeran la prueba de forma explícita cuando se calcula el conjunto de destinos de nivel superior para compilar o ejecutar para los comandos build, test y coverage. No afecta la expansión de comodines de destino ni de conjuntos de pruebas en otros contextos, incluido el comando query. Ten en cuenta que manual no implica que los sistemas de compilación y prueba continuos no deban compilar o ejecutar un destino automáticamente. Por ejemplo, puede ser conveniente excluir un destino de bazel test ... porque requiere marcas específicas de Bazel, pero aún así incluirlo en ejecuciones de pruebas continuas o previas al envío configuradas correctamente.
  • La palabra clave external forzará la ejecución incondicional de la prueba (independientemente del valor de --cache_test_results).
Consulta Convenciones de etiquetas en la Enciclopedia de pruebas para obtener más convenciones sobre las etiquetas adjuntas a los destinos de prueba.
target_compatible_with

Lista de etiquetas. El valor predeterminado es [].

Es una lista de constraint_values que deben estar presentes en la plataforma de destino para que este destino se considere compatible. Esto se suma a las restricciones que ya establece el tipo de regla. Si la plataforma de destino no satisface todas las restricciones enumeradas, se considera que el destino es incompatible. Los destinos incompatibles se omiten para la compilación y las pruebas cuando se expande el patrón de destino (p.ej., //..., :all). Cuando se especifican de forma explícita en la línea de comandos, los destinos incompatibles hacen que Bazel imprima un error y provoquen una falla en la compilación o la prueba.

Los destinos que dependen de forma transitiva de destinos incompatibles también se consideran incompatibles. También se omiten para la compilación y las pruebas.

Una lista vacía (que es el valor predeterminado) indica que el destino es compatible con todas las plataformas.

Todos los parámetros, excepto Workspace Rules, admiten este atributo. En algunas reglas, este atributo no tiene efecto. Por ejemplo, no es útil especificar target_compatible_with para un cc_toolchain.

Consulta la página Plataformas para obtener más información sobre el salto de objetivos incompatibles.

testonly

Booleano; no configurable; el valor predeterminado es False, excepto para los destinos de prueba y de suite de pruebas

Si es True, solo los destinos de testonly (como las pruebas) pueden depender de este destino.

De manera equivalente, una regla que no es testonly no puede depender de ninguna regla que sea testonly.

Las pruebas (reglas *_test) y los paquetes de pruebas (reglas test_suite) son testonly de forma predeterminada.

El objetivo de este atributo es indicar que el destino no debe incluirse en los archivos binarios que se lanzan para producción.

Dado que testonly se aplica en el momento de la compilación, no en el de la ejecución, y se propaga de forma viral a través del árbol de dependencias, se debe aplicar con prudencia. Por ejemplo, los stubs y los fakes que son útiles para las pruebas de unidades también pueden serlo para las pruebas de integración que involucran los mismos archivos binarios que se lanzarán en producción y, por lo tanto, probablemente no deberían marcarse como testonly. Por el contrario, las reglas que son peligrosas incluso para vincularse, tal vez porque anulan incondicionalmente el comportamiento normal, definitivamente deben marcarse como testonly.

toolchains

Lista de etiquetas; no configurable; el valor predeterminado es []

Es el conjunto de destinos a los que este destino puede acceder a las variables de compilación. Estos destinos son instancias de reglas que proporcionan TemplateVariableInfo o destinos especiales para tipos de cadenas de herramientas integradas en Bazel. Entre ellas, se incluyen las siguientes:

  • @bazel_tools//tools/cpp:toolchain_type
  • @rules_java//toolchains:current_java_runtime

Ten en cuenta que esto es distinto del concepto de resolución de cadenas de herramientas que utilizan las implementaciones de reglas para la configuración dependiente de la plataforma. No puedes usar este atributo para determinar qué cc_toolchain o java_toolchain específicos usará un destino.

visibility

Lista de etiquetas; nonconfigurable; el valor predeterminado varía

El atributo visibility controla si los objetivos en otras ubicaciones pueden depender del objetivo. Consulta la documentación sobre la visibilidad.

Para los destinos declarados directamente en un archivo BUILD o en macros heredadas llamadas desde un archivo BUILD, el valor predeterminado es el default_visibility del paquete (si se especifica) o ["//visibility:private"]. Para los destinos declarados en una o más macros simbólicas, el valor predeterminado siempre es solo ["//visibility:private"] (lo que hace que solo se pueda usar dentro del paquete que contiene el código de la macro).

Atributos comunes a todas las reglas de prueba (*_test)

En esta sección, se describen los atributos que son comunes a todas las reglas de prueba.

Atributo Descripción
args

Lista de cadenas, sujeta a la sustitución de $(location) y "Make variable", y a la tokenización de Bourne shell; el valor predeterminado es []

Son los argumentos de línea de comandos que Bazel pasa al destino cuando se ejecuta con bazel test.

Estos argumentos se pasan antes de cualquier valor de --test_arg especificado en la línea de comandos de bazel test.

env

Diccionario de cadenas. Los valores están sujetos a la sustitución de $(location) y "Make variable". El valor predeterminado es {}.

Especifica variables de entorno adicionales que se deben configurar cuando bazel test ejecuta la prueba.

Este atributo solo se aplica a las reglas nativas, como cc_test, py_test y sh_test. No se aplica a las reglas de prueba definidas por Starlark. En tus propias reglas de Starlark, puedes agregar un atributo "env" y usarlo para propagar un proveedor de RunEnvironmentInfo.

TestEnvironment Proveedor.

env_inherit

Lista de cadenas; el valor predeterminado es []

Especifica variables de entorno adicionales para heredar del entorno externo cuando bazel test ejecuta la prueba.

Este atributo solo se aplica a las reglas nativas, como cc_test, py_test y sh_test. No se aplica a las reglas de prueba definidas por Starlark.

size

Cadena "enormous", "large", "medium" o "small"; no configurable; el valor predeterminado es "medium"

Especifica la "carga" de un destino de prueba: cuánto tiempo o recursos necesita para ejecutarse.

Las pruebas de unidades se consideran "pequeñas", las pruebas de integración "medianas" y las pruebas de extremo a extremo "grandes" o "enormes". Bazel usa el tamaño para determinar un tiempo de espera predeterminado, que se puede anular con el atributo timeout. El tiempo de espera se aplica a todas las pruebas del destino de compilación, no a cada prueba individual. Cuando la prueba se ejecuta de forma local, size también se usa para la programación: Bazel intenta respetar --local_{ram,cpu}_resources y no sobrecargar la máquina local ejecutando muchas pruebas pesadas al mismo tiempo.

Los tamaños de las pruebas corresponden a los siguientes tiempos de espera predeterminados y usos máximos supuestos de recursos locales:

Tamaño RAM (en MB) CPU (en núcleos de CPU) Tiempo de espera predeterminado
pequeña 20 1 Corto (1 minuto)
media 100 1 Moderada (5 minutos)
grande 300 1 Larga (15 minutos)
enorme 800 1 Eterno (60 minutos)

La variable de entorno TEST_SIZE se establecerá en el valor de este atributo cuando se genere la prueba.

timeout

Cadena "short", "moderate", "long" o "eternal"; no configurable; el valor predeterminado se deriva del atributo size de la prueba

Es el tiempo que se espera que se ejecute la prueba antes de que se muestre el resultado.

Si bien el atributo de tamaño de una prueba controla la estimación de recursos, el tiempo de espera de una prueba se puede establecer de forma independiente. Si no se especifica de forma explícita, el tiempo de espera se basa en el tamaño de la prueba. El tiempo de espera de la prueba se puede anular con la marca --test_timeout, p.ej., para ejecutarla en ciertas condiciones que se sabe que son lentas. Los valores de tiempo de espera de la prueba corresponden a los siguientes períodos:

Valor del tiempo de espera Período
short 1 minuto
Moderada 5 minutos
long 15 minutos
eterno 60 minutos

Para otros momentos, el tiempo de espera de la prueba se puede anular con la marca --test_timeout de Bazel, p.ej., para ejecutar manualmente en condiciones que se sabe que son lentas. Los valores de --test_timeout están en segundos. Por ejemplo, --test_timeout=120 establecerá el tiempo de espera de la prueba en dos minutos.

La variable de entorno TEST_TIMEOUT se establecerá en el tiempo de espera de la prueba (en segundos) cuando se genere la prueba.

flaky

Booleano; no se puede configurar; el valor predeterminado es False

Marca la prueba como inestable.

Si se configura, ejecuta la prueba hasta tres veces y la marca como fallida solo si falla cada vez. De forma predeterminada, este atributo se establece en False y la prueba se ejecuta solo una vez. Ten en cuenta que, en general, se desaconseja el uso de este atributo: las pruebas deben aprobarse de manera confiable cuando se mantienen sus aserciones.

shard_count

Número entero no negativo menor o igual a 50; el valor predeterminado es -1

Especifica la cantidad de fragmentos paralelos que se usarán para ejecutar la prueba.

Si se configura, este valor anulará cualquier heurística que se use para determinar la cantidad de fragmentos paralelos con los que se ejecutará la prueba. Ten en cuenta que, para algunas reglas de prueba, este parámetro puede ser obligatorio para habilitar la fragmentación en primer lugar. Consulta también --test_sharding_strategy.

Si la división de pruebas está habilitada, la variable de entorno TEST_TOTAL_SHARDS se establecerá en este valor cuando se genere la prueba.

La fragmentación requiere que el ejecutor de pruebas admita el protocolo de fragmentación de pruebas. Si no es así, es muy probable que se ejecuten todas las pruebas en cada fragmento, lo que no es lo que deseas.

Consulta Fragmentación de pruebas en la Enciclopedia de pruebas para obtener detalles sobre la fragmentación.

local

Booleano; no se puede configurar; el valor predeterminado es False

Fuerza la ejecución de la prueba de forma local, sin aislamiento.

Establecer este valor en verdadero equivale a proporcionar "local" como etiqueta (tags=["local"]).

Atributos comunes a todas las reglas binarias (*_binary)

En esta sección, se describen los atributos que son comunes a todas las reglas binarias.

Atributo Descripción
args

Lista de cadenas, sujeta a la sustitución de $(location) y "Make variable", y a la tokenización de Bourne shell; no configurable; el valor predeterminado es []

Son los argumentos de la línea de comandos que Bazel pasará al destino cuando se ejecute con el comando run o como prueba. Estos argumentos se pasan antes de los que se especifican en la línea de comandos bazel run o bazel test.

NOTA: Los argumentos no se pasan cuando ejecutas el destino fuera de Bazel (por ejemplo, cuando ejecutas manualmente el archivo binario en bazel-bin/).

env

Diccionario de cadenas. Los valores están sujetos a la sustitución de $(location) y "Make variable". El valor predeterminado es {}.

Especifica variables de entorno adicionales que se deben configurar cuando bazel run ejecuta el destino.

Este atributo solo se aplica a las reglas nativas, como cc_binary, py_binary y sh_binary. No se aplica a las reglas ejecutables definidas por Starlark. Para tus propias reglas de Starlark, puedes agregar un atributo "env" y usarlo para propagar un proveedor de RunEnvironmentInfo.

NOTA: Las variables de entorno no se configuran cuando ejecutas el destino fuera de Bazel (por ejemplo, cuando ejecutas de forma manual el archivo binario en bazel-bin/).

output_licenses

Lista de cadenas; el valor predeterminado es []

Son las licencias de los archivos de salida que genera este archivo binario. Esta es parte de una API de licencias obsoleta que Bazel ya no usa. No uses esta opción.

Atributos configurables

La mayoría de los atributos son "configurables", lo que significa que sus valores pueden cambiar cuando el destino se compila de diferentes maneras. Específicamente, los atributos configurables pueden variar según las marcas que se pasen a la línea de comandos de Bazel o la dependencia de nivel inferior que solicite el destino. Esto se puede usar, por ejemplo, para personalizar el destino para múltiples plataformas o modos de compilación.

En el siguiente ejemplo, se declaran diferentes fuentes para diferentes arquitecturas de destino. Ejecutar bazel build :multiplatform_lib --cpu x86 compilará el destino con x86_impl.cc, mientras que sustituir --cpu arm hará que se use arm_impl.cc.

cc_library(
    name = "multiplatform_lib",
    srcs = select({
        ":x86_mode": ["x86_impl.cc"],
        ":arm_mode": ["arm_impl.cc"]
    })
)
config_setting(
    name = "x86_mode",
    values = { "cpu": "x86" }
)
config_setting(
    name = "arm_mode",
    values = { "cpu": "arm" }
)

La función select() elige entre diferentes valores alternativos para un atributo configurable según los criterios de config_setting o constraint_value que satisfaga la configuración del objetivo.

Bazel evalúa los atributos configurables después de procesar las macros y antes de procesar las reglas (técnicamente, entre las fases de carga y análisis). Cualquier procesamiento anterior a la evaluación de select() no sabe qué rama elige select(). Por ejemplo, las macros no pueden cambiar su comportamiento en función de la rama elegida, y bazel query solo puede hacer suposiciones conservadoras sobre las dependencias configurables de un destino. Consulta estas Preguntas frecuentes para obtener más información sobre el uso de select() con reglas y macros.

Los atributos marcados como nonconfigurable en su documentación no pueden usar esta función. Por lo general, un atributo no se puede configurar porque Bazel necesita saber su valor de forma interna antes de poder determinar cómo resolver un select().

Consulta Configurable Build Attributes para obtener una descripción general detallada.

Objetivos de salida implícitos

Las salidas implícitas en C++ están obsoletas. Si es posible, evita usarlo en otros idiomas. Aún no tenemos una ruta de baja, pero también dejarán de estar disponibles.

Cuando defines una regla de compilación en un archivo BUILD, declaras de forma explícita un destino de regla nuevo con nombre en un paquete. Muchas funciones de reglas de compilación también implican implícitamente uno o más destinos de archivos de salida, cuyo contenido y significado son específicos de la regla. Por ejemplo, cuando declaras explícitamente una regla java_binary(name='foo', ...), también declaras implícitamente un destino de archivo de salida foo_deploy.jar como miembro del mismo paquete. (Este destino en particular es un archivo Java autónomo apto para la implementación).

Los destinos de salida implícitos son miembros de primer nivel del gráfico de destino global. Al igual que otros destinos, se compilan a pedido, ya sea cuando se especifican en el comando de compilación de nivel superior o cuando son requisitos previos necesarios para otros destinos de compilación. Se pueden hacer referencia a ellos como dependencias en los archivos BUILD y se pueden observar en el resultado de herramientas de análisis como bazel query.

Para cada tipo de regla de compilación, la documentación de la regla contiene una sección especial en la que se detallan los nombres y el contenido de los resultados implícitos que implica una declaración de ese tipo de regla.

Una distinción importante, pero algo sutil, entre los dos espacios de nombres que usa el sistema de compilación: Las etiquetas identifican destinos, que pueden ser reglas o archivos, y los destinos de archivos se pueden dividir en destinos de archivos fuente (o de entrada) y destinos de archivos derivados (o de salida). Son los elementos que puedes mencionar en los archivos BUILD, compilar desde la línea de comandos o examinar con bazel query; este es el espacio de nombres del destino. Cada destino de archivo corresponde a un archivo real en el disco (el "espacio de nombres del sistema de archivos"); cada destino de regla puede corresponder a cero, uno o más archivos reales en el disco. Es posible que haya archivos en el disco que no tengan un destino correspondiente. Por ejemplo, no se puede hacer referencia a los archivos objeto .o producidos durante la compilación de C++ desde los archivos BUILD ni desde la línea de comandos. De esta manera, la herramienta de compilación puede ocultar ciertos detalles de implementación sobre cómo realiza su trabajo. Esto se explica con más detalle en la Referencia del concepto de BUILD.