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 las compilaciones sin conexión o cuando deseas controlar la fuente de una dependencia externa.
Habilita el modo de proveedor
Puedes habilitar el modo de proveedor si especificas la marca --vendor_dir.
Por ejemplo, si la agregas 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 de acceso absoluta.
Vende un repositorio externo específico
Puedes usar el comando vendor con la marca --repo para especificar qué repositorio
vender. Acepta el nombre de repositorio
canónico y el nombre de repositorio
aparente.
Por ejemplo, si ejecutas lo siguiente:
bazel vendor --vendor_dir=vendor_src --repo=@rules_cc
o
bazel vendor --vendor_dir=vendor_src --repo=@@rules_cc~
se obtendrán reglas_cc para venderse en
<workspace root>/vendor_src/rules_cc~.
Vende dependencias externas para los destinos determinados
Para vender 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 target
y todos los destinos en //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 las marcas de compilación se pueden aplicar a este comando y
afectar el resultado.
Compila el destino sin conexión
Con las dependencias externas vendidas, 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 debería funcionar en un entorno de compilación limpio sin acceso a la red ni caché del repositorio.
Por lo tanto, deberías poder registrar la fuente vendida y compilar los mismos destinos sin conexión en otra máquina.
Vende todas las dependencias externas
Para vender todos los repositorios en tu gráfico de dependencias externas transitivas, puedes ejecutar lo siguiente:
bazel vendor --vendor_dir=vendor_src
Ten en cuenta que vender todas las dependencias tiene algunas desventajas:
- Recuperar todos los repositorios, incluidos los que se introducen de forma transitiva, puede llevar mucho tiempo.
- El directorio del proveedor puede volverse muy grande.
- Es posible que algunos repositorios no se recuperen si no son compatibles con la plataforma o el entorno actuales.
Por lo tanto, considera vender primero para destinos específicos.
Configura el modo de proveedor con VENDOR.bazel
Puedes controlar cómo se controlan los repositorios determinados con el archivo VENDOR.bazel ubicado en el directorio del proveedor.
Hay dos directivas disponibles que 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 vendida actual como si hubiera una--override_repositorymarca para este repositorio. Bazel NO actualizará la fuente vendida para este repositorio mientras se ejecuta el comando vendor, a menos que se desanclaje. El usuario puede modificar y mantener la fuente vendida para este repositorio de forma manual.
Por ejemplo:
ignore("@@rules_cc~")
pin("@@bazel_skylib~")
Con esta configuración:
- Ambos repositorios se excluirán de los comandos de proveedor posteriores.
- El repositorio
bazel_skylibse anulará a la fuente ubicada en el directorio del proveedor. - El usuario puede modificar de forma segura la fuente vendida de
bazel_skylib. - Para volver a vender
bazel_skylib, el usuario primero debe inhabilitar la instrucción pin.
Comprende cómo funciona el modo de proveedor
Bazel recupera las dependencias externas de un proyecto en $(bazel info
output_base)/external. Vender dependencias externas significa mover los archivos y directorios relevantes al directorio del proveedor determinado y usar la fuente vendida 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 vendido está actualizado o el repositorio está
fijado en el archivo VENDOR.bazel, Bazel usa la fuente vendida creando
un symlink a ella en $(bazel info output_base)/external en lugar de ejecutar
la regla del repositorio. De lo contrario, se imprime una advertencia y Bazel volverá a
recuperar la versión más reciente del repositorio.
Vende archivos de registro
Bazel debe realizar la resolución del módulo de Bazel para recuperar dependencias externas, lo que puede requerir el acceso a archivos de registro a través de Internet. Para
lograr una compilación sin conexión, Bazel vende todos los archivos de registro recuperados de
la red en el directorio <vendor_dir>/_registries.
Vende symlinks
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 symlinks en la fuente vendida:
- Crea un symlink
<vendor_dir>/bazel-externalque apunte a$(bazel info output_base)/external. Se actualiza automáticamente con cada comando de Bazel. - Para la fuente vendida, reescribe todos los symlinks que originalmente apuntan a una
ruta de acceso en
$(bazel info output_base)/externala 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 reescribirá a
<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 <vendor_dir>/bazel-external lo genera Bazel automáticamente, se
recomienda agregarlo a .gitignore o equivalente para evitar registrarlo.
Con esta estrategia, los symlinks en la fuente vendida deberían funcionar correctamente incluso después de que la fuente vendida se mueva a otra ubicación o se cambie la base de salida de Bazel.