En esta página, se explica cómo definir las reglas del repositorio y se proporcionan ejemplos para más detalles.
Un repositorio externo es un árbol de directorios.
que contiene archivos de origen que se pueden usar en una compilación de Bazel, que se genera a pedido por
ejecutando la regla del repositorio correspondiente. Los repositorios se pueden definir
pero, en última instancia, cada repo se define invocando una regla de repo, al igual que
estos se definen con la invocación de reglas de compilación. Pueden usarse para depender
bibliotecas de terceros (como las bibliotecas empaquetadas de Maven), sino también para generar
Archivos BUILD
específicos del host en el que se ejecuta Bazel
Definición de la regla del repositorio
En un archivo .bzl
, usa el elemento
función repository_rule para definir un
nueva regla de repositorio y almacénala en una variable global. Después de definir una regla de repositorio,
puede invocarse como una función para definir repositorios. Por lo general, esta invocación
realizar desde la implementación de una extensión de módulo
.
Los dos componentes principales de una definición de reglas de repositorio son su esquema de atributos y función de implementación. El esquema de atributos determina los nombres y tipos de pasan a una invocación de regla de repo, y la función de implementación se cuando se deba recuperar el repositorio.
Atributos
Los atributos son argumentos que se pasan a la invocación de la regla del repositorio. El esquema de
atributos aceptados por una regla de repositorio se especifican con el argumento attrs
cuando
La regla del repositorio se define con una llamada a repository_rule
. Una definición de ejemplo
Los atributos url
y sha256
como cadenas:
http_archive = repository_rule(
implementation=_impl,
attrs={
"url": attr.string(mandatory=True),
"sha256": attr.string(mandatory=True),
}
)
Para acceder a un atributo dentro de la función de implementación, use
repository_ctx.attr.<attribute_name>
:
def _impl(repository_ctx):
url = repository_ctx.attr.url
checksum = repository_ctx.attr.sha256
Todos los repository_rule
tienen el atributo name
definido de forma implícita. Este es un
de cadena que se comporta de forma mágica: cuando se especifica como una entrada para
Una invocación de regla de repositorio toma un nombre aparente del repositorio. pero cuando se lee desde el
la función de implementación de la regla de repositorio con repository_ctx.attr.name
, muestra
el nombre del repo canónico.
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 genera el mismo repo. 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 los documentos de la API para
más contexto. 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?
La función de implementación de una regla de repositorio se ejecuta cuando Bazel necesita un objetivo de ese repositorio, por ejemplo, cuando otro destino (en otro repo) depende de él o si se menciona en la línea de comandos. El se espera que la función de implementación cree el repositorio en el archivo en un sistema de archivos. Esto se llama "recuperar" del repo.
A diferencia de los objetivos habituales, los repositorios no necesariamente se vuelven a recuperar cuando algo cambia que haría que el repo sea diferente. Este es porque hay aspectos en los que Bazel no puede detectar cambios o causar demasiada sobrecarga en cada compilación (por ejemplo, elementos que se recuperan de la red). Por lo tanto, los repositorios se vuelven a recuperar solo si uno de los los siguientes cambios:
- Los atributos que se pasan a la invocación de la regla del repositorio.
- El código de Starlark, que comprende la implementación de la regla del repositorio.
- El valor de cualquier variable de entorno que se pase a la de
repository_ctx
getenv()
o se declaró con el atributoenviron
de larepository_rule
Los valores de estas variables de entorno se pueden conectar por cable en la línea de comandos con el--repo_env
. - El contenido de cualquier archivo que se pase a
read()
,execute()
y otros similares métodos derepository_ctx
a los que hace referencia una etiqueta (por ejemplo,//mypkg:label.txt
, pero nomypkg/label.txt
) - Cuando se ejecuta
bazel fetch --force
Hay dos parámetros de repository_rule
que controlan cuándo se crean
se vuelven a recuperar:
- Si se establece la marca
configure
, el repositorio solo se vuelve a recuperar elbazel fetch
cuando se le pasa el parámetro--configure
(si el no está establecido, este comando no hará que se vuelva a recuperar) - Si se establece la marca
local
, además de los casos anteriores, el repositorio también se vuelve a recuperar cuando se reinicia el servidor de Bazel.
Reinicia la función de implementación
La función de implementación se puede reiniciar mientras se crea un repositorio. se recupera si falta una dependencia que solicita. En ese caso, la ejecución de se detendrá la función de implementación, se resolverá la dependencia faltante La función se volverá a ejecutar después de que se haya resuelto la dependencia. Para evita los 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.
Fuerza la 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 fetch --force --all
.
Además, algunas reglas del repositorio 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 fetch --all --configure
Ejemplos
Cadena de herramientas configurada automáticamente para C++: usa una regla de repositorio para crear automáticamente 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.