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 quieres controlar el origen de una dependencia externa.
Habilitar el modo de proveedor
Puedes habilitar el modo de proveedor si especificas la marca --vendor_dir
.
Por ejemplo, si lo 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 absoluta.
Proporciona un repositorio externo específico
Puedes usar el comando vendor
con la marca --repo
para especificar qué repositorio deseas con el proveedor; acepta tanto el nombre del repositorio canónico como el nombre aparente del repositorio.
Por ejemplo, puedes ejecutar lo siguiente:
bazel vendor --vendor_dir=vendor_src --repo=@rules_cc
o
bazel vendor --vendor_dir=vendor_src --repo=@@rules_cc~
ambos obtendrán rules_cc, que se incluirán 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/...
proporcionará todos los repositorios necesarios para compilar el destino //src/main:hello-world
y todos los destinos en //src/test/...
con la configuración actual.
De forma interna, ejecuta un comando bazel build --nobuild
para analizar los patrones de destino, por lo que las marcas de compilación se podrían aplicar a este comando y afectar el resultado.
Compila el destino sin conexión
Con las dependencias externas que se proporcionan, puedes crear el destino sin conexión
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, debes poder registrar la fuente del proveedor y compilar los mismos destinos sin conexión en otra máquina.
Proporciona todas las dependencias externas
Para suministrar 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 proveer todas las dependencias tiene algunas desventajas:
- Recuperar todos los repositorios, incluidos los que se ingresaron de forma transitiva, puede llevar mucho tiempo.
- El directorio del proveedor puede ser muy grande.
- Es posible que algunos repositorios no se puedan recuperar si no son compatibles con la plataforma o el entorno actuales.
Por lo tanto, considera primero ofrecer 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, y ambas aceptan una lista de nombres de repositorios canónicos como argumentos:
ignore()
: Para ignorar por completo un repositorio del modo de proveedor.pin()
: Sirve para fijar un repositorio a su fuente proveedora actual como si hubiera una marca--override_repository
para este repositorio. Bazel NO actualizará la fuente proporcionada por el proveedor para este repositorio mientras ejecuta el comando del proveedor, a menos que no esté fijado. 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 posteriores de proveedores.
- El repositorio
bazel_skylib
se anulará en la fuente ubicada en el directorio del proveedor. - El usuario puede modificar de forma segura la fuente proveedora de
bazel_skylib
. - Para volver a proporcionar el proveedor
bazel_skylib
, el usuario primero debe inhabilitar la declaración del pin.
Comprende cómo funciona el modo de proveedor
Bazel recupera dependencias externas de un proyecto en $(bazel info
output_base)/external
. Proporcionar dependencias externas significa trasladar archivos y directorios relevantes a un directorio de proveedor determinado y usar la fuente proporcionada para compilaciones posteriores.
El contenido que se proporciona incluye lo siguiente:
- El directorio del repositorio
- El archivo marcador del repositorio
Durante una compilación, si el archivo del marcador que se proporciona está actualizado o el repositorio está
fijado en el archivo VENDOR.bazel, Bazel usa la fuente proporcionada. Para ello, crea
un symlink a ella en $(bazel info output_base)/external
en lugar de
ejecutar realmente la regla del repositorio. De lo contrario, se imprimirá una advertencia y Bazel recurrirá a recuperar la versión más reciente del repositorio.