El modo de proveedor es una función de Bzlmod que te permite crear una copia local de las dependencias externas. Esto es útil para compilaciones sin conexión o cuando deseas controlar la fuente de una dependencia externa.
Habilita el modo de proveedor
Para habilitar el modo de proveedor, especifica la marca --vendor_dir
.
Por ejemplo, puedes agregarlo a tu archivo .bazelrc
:
# Enable vendor mode with vendor directory under <workspace>/vendor_src
common --vendor_dir=vendor_src
El directorio del proveedor puede ser una ruta de acceso relativa a la raíz de tu lugar de trabajo o una ruta absoluta.
Vende un repositorio externo específico
Puedes usar el comando vendor
con la marca --repo
para especificar qué repositorio deseas con el proveedor. Este acepta el nombre del repositorio canónico y el nombre aparente del repositorio.
Por ejemplo, ejecuta lo siguiente:
bazel vendor --vendor_dir=vendor_src --repo=@rules_cc
o
bazel vendor --vendor_dir=vendor_src --repo=@@rules_cc+
harán que rules_cc se venda en <workspace root>/vendor_src/rules_cc+
.
Dependencias externas del proveedor para objetivos determinados
Si quieres suministrar todas las dependencias externas necesarias para compilar patrones de destino determinados, puedes ejecutar bazel vendor <target patterns>
.
Por ejemplo:
bazel vendor --vendor_dir=vendor_src //src/main:hello-world //src/test/...
venderá todos los repositorios necesarios para compilar el destino //src/main:hello-world
y todos los destinos de //src/test/...
con la configuración actual.
En segundo plano, se ejecuta un comando bazel build --nobuild
para analizar los patrones de destino, por lo que se pueden aplicar marcas de compilación a este comando y afectar el resultado.
Compila el destino sin conexión
Con las dependencias externas del proveedor, puedes compilar el destino sin conexión de la siguiente manera:
bazel build --vendor_dir=vendor_src //src/main:hello-world //src/test/...
La compilación debe funcionar en un entorno de compilación limpio sin acceso a la red ni caché del repositorio.
Por lo tanto, deberías poder consultar la fuente del proveedor y compilar los mismos objetivos sin conexión en otra máquina.
Cómo vender todas las dependencias externas
Para vender todos los repositorios de tu gráfico de dependencias externas transitivas, puedes ejecutar lo siguiente:
bazel vendor --vendor_dir=vendor_src
Ten en cuenta que proveer todas las dependencias tiene algunas desventajas:
- La recuperación de todos los repositorios, incluidos los que se introducen de forma transitiva, puede llevar tiempo.
- El directorio del proveedor puede ser muy grande.
- Es posible que algunos repositorios no se recuperen si no son compatibles con la plataforma o el entorno actuales.
Por lo tanto, primero considera la adquisición de proveedores para objetivos específicos.
Configura el modo de proveedor con VENDOR.bazel
Puedes controlar cómo se controlan los repositorios con el archivo VENDOR.bazel ubicado en el directorio de proveedores.
Hay dos directivas disponibles, ambas aceptan una lista de nombres de repositorios canónicos como argumentos:
ignore()
: Para ignorar por completo un repositorio del modo de proveedor.pin()
: Para fijar un repositorio a su fuente actual del proveedor, como si hubiera una marca--override_repository
para este repositorio. Bazel NO actualizará la fuente proporcionada por el proveedor para este repositorio mientras se ejecuta el comando vendor, a menos que se desfije. El usuario puede modificar y mantener manualmente el origen del proveedor para este repo.
Por ejemplo:
ignore("@@rules_cc+")
pin("@@bazel_skylib+")
Con esta configuración
- Ambos repositorios se excluirán de los comandos de proveedores posteriores.
- Se anulará el
bazel_skylib
del repositorio por la fuente que se encuentra en el directorio del proveedor. - El usuario puede modificar de forma segura la fuente proporcionada por el proveedor de
bazel_skylib
. - Para volver a vender
bazel_skylib
, el usuario primero debe inhabilitar la sentencia de pin.
Comprende cómo funciona el modo de proveedor
Bazel recupera las dependencias externas de un proyecto en $(bazel info
output_base)/external
. Proporcionar dependencias externas significa mover los archivos y directorios relevantes al directorio de proveedor determinado y usar la fuente vedada para compilaciones posteriores.
El contenido que se vende incluye lo siguiente:
- El directorio del repositorio
- El archivo de marcador del repositorio
Durante una compilación, si el archivo de marcador del proveedor está actualizado o el repositorio está fijado en el archivo VENDOR.bazel, Bazel usa la fuente del proveedor creando un symlink a él en $(bazel info output_base)/external
en lugar de ejecutar la regla del repositorio. De lo contrario, se imprimirá una advertencia y Bazel recurrirá a recuperar la versión más reciente del repositorio.
Archivos de registro del proveedor
Bazel debe realizar la resolución del módulo de Bazel para recuperar dependencias
externas, lo que puede requerir acceso a archivos de registro a través de Internet. Para
lograr la compilación sin conexión, Bazel proporciona todos los archivos de registro recuperados de la red en el directorio <vendor_dir>/_registries
.
symlinks de proveedores
Los repositorios externos pueden contener symlinks que apuntan a otros archivos o directorios. Para asegurarse de que los symlinks funcionen correctamente, Bazel usa la siguiente estrategia para reescribir los symlinks en la fuente del proveedor:
- Crea un symlink
<vendor_dir>/bazel-external
que apunte a$(bazel info output_base)/external
. Se actualiza automáticamente con cada comando de Bazel. - Para la fuente del proveedor, vuelve a escribir todos los symlinks que originalmente apuntan a una ruta de acceso en
$(bazel info output_base)/external
a una ruta de acceso relativa en<vendor_dir>/bazel-external
.
Por ejemplo, si el symlink original es
<vendor_dir>/repo_foo+/link => $(bazel info output_base)/external/repo_bar+/file
Se volverá a escribir en
<vendor_dir>/repo_foo+/link => ../../bazel-external/repo_bar+/file
en el que
<vendor_dir>/bazel-external => $(bazel info output_base)/external # This might be new if output base is changed
Dado que Bazel genera <vendor_dir>/bazel-external
automáticamente, se recomienda agregarlo a .gitignore
o un equivalente para evitar que se marque.
Con esta estrategia, los symlinks en la fuente proveedora deberían funcionar correctamente incluso después de que la fuente proveedora se traslade a otra ubicación o se cambie la base de salida de Bazel.