Reglas del repositorio

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

En esta página, se explica cómo crear reglas de repositorio y se proporcionan ejemplos para más detalles.

Un repositorio externo es una regla que solo se puede usar en el archivo WORKSPACE y habilita la operación no hermética en la fase de carga de Bazel. Cada regla de repositorio externo crea su propio espacio de trabajo, con sus poseer archivos y artefactos BUILD. Pueden usarse para depender de terceros (como las bibliotecas empaquetadas de Maven), pero también para generar archivos BUILD específicas del host en el que se ejecuta Bazel.

Creación de reglas de repositorio

En un archivo .bzl, usa el elemento función repository_rule para crear un nuevo de Cloud SQL y almacenarla en una variable global.

Una regla de repositorio personalizada se puede usar como una regla de repositorio nativo. Integra tiene un atributo name obligatorio y cada destino presente en sus archivos de compilación puede denominarse @<name>//package:target, donde <name> es el valor de la atributo name.

La regla se carga cuando la compilas explícitamente, o si es una dependencia de la compilación. En este caso, Bazel ejecutará su función implementation. Esta describen cómo crear el repositorio, su contenido y los archivos BUILD.

Atributos

Un atributo es un argumento de regla, como url o sha256. Debes enumerar los atributos y sus tipos cuando defines una regla de repositorio.

local_repository = repository_rule(
    implementation=_impl,
    local=True,
    attrs={"path": attr.string(mandatory=True)})

Para acceder a un atributo, usa repository_ctx.attr.<attribute_name>.

Todos los repository_rule tienen atributos definidos de forma implícita (al igual que la compilación reglas). Los dos atributos implícitos son name (al igual que ocurre con las reglas de compilación) repo_mapping Se puede acceder al nombre de una regla de repositorio con repository_ctx.name El significado de repo_mapping es el mismo que para el reglas de repositorio nativo local_repository y new_local_repository

Si el nombre de un atributo comienza con _, es privado y los usuarios no pueden establecerlo.

Función de implementación

Cada regla de repositorio requiere una función implementation. Contiene las la lógica real de la regla y se ejecuta estrictamente en la fase de carga.

La función tiene exactamente un parámetro de entrada, repository_ctx. La función devuelve None para indicar que la regla es reproducible en función de la parámetros específicos, o un dict con un conjunto de parámetros para esa regla que convertiría esa regla en una reproducible que generaba el mismo repositorio. Para ejemplo, para una regla que realiza un seguimiento de un repositorio de Git, esto implicaría mostrar un identificador de confirmación específico en lugar de una rama flotante que originalmente estaba especificada.

El parámetro de entrada repository_ctx se puede usar para lo siguiente: de atributos de acceso y funciones no herméticas (encontrar un objeto binario, ejecutar un objeto binario, crear un archivo en el repositorio o descargar un archivo desde Internet). Consulta la biblioteca para obtener más información adicional. Ejemplo:

def _impl(repository_ctx):
  repository_ctx.symlink(repository_ctx.attr.path, "")

local_repository = repository_rule(
    implementation=_impl,
    ...)

¿Cuándo se ejecuta la función de implementación?

Si el repositorio se declara como local, cambia en una dependencia. en el gráfico de dependencias (incluido el propio archivo WORKSPACE) provocará la ejecución de la función de implementación.

La función de implementación se puede reiniciar si es una dependencia solicitudes faltan. El comienzo de la función de implementación se volverá a ejecutar luego de que se haya resuelto la dependencia. Para evitar reinicios innecesarios (que son costosos, ya que el acceso a la red puede se deben repetir), los argumentos de etiqueta se cargan previamente, siempre y cuando los argumentos de etiqueta se pueden resolver en un archivo existente. Ten en cuenta que resolver una ruta de acceso a partir de una string o una etiqueta que se construyó solo durante la ejecución de la función aún podría causar un reinicio.

Por último, para los repositorios que no son local, solo un cambio en la siguiente las dependencias pueden provocar un reinicio:

  • Archivos .bzl necesarios para definir la regla del repositorio.
  • Declaración de la regla del repositorio en el archivo WORKSPACE.
  • Valor de cualquier variable de entorno declarada con environ atributo de la repository_rule . El valor de esas variables de entorno se puede aplicar desde la línea de comandos con el --action_env marca (pero esta invalidará cada acción de la compilación).
  • Contenido de cualquier archivo que se use y al que haga referencia una etiqueta (por ejemplo, //mypkg:label.txt, no mypkg/label.txt).

Fuerza la nueva recuperación de repositorios externos

A veces, un repositorio externo puede quedar desactualizado sin ningún cambio en su definición o dependencias. Por ejemplo, un repositorio que recupera fuentes podría siguen una rama específica de un repositorio de terceros, y se agregan disponibles en esa rama. En este caso, puedes pedirle a Bazel que vuelva a recuperar todos a repositorios externos de forma incondicional llamando a bazel sync.

Además, algunas reglas inspeccionan la máquina local y podrían si se actualizó la máquina local. Aquí puedes pedirle a Bazel que solo recuperar los repositorios externos en los que repository_rule definición tiene establecido el atributo configure, usa bazel sync --configure.

Ejemplos

  • Cadena de herramientas configurada automáticamente para C++: usa una regla de repositorio para crear automáticamente la archivos de configuración de C++ para Bazel buscando el compilador C++ local, el y los indicadores que admite el compilador de C++.

  • Repositorios de Go usa varios repository_rule para definir la lista de dependencias necesarias para usar las reglas de Go.

  • rules_jvm_external crea un repositorio externo llamado @maven de forma predeterminada que genera destinos de compilación para cada artefacto Maven en el árbol de dependencias transitivo.