Modo de proveedor

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

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 de acceso absoluta.

Proporciona un repositorio externo específico

Puedes usar el comando vendor con la marca --repo para especificar qué repositorio al proveedor, acepta tanto el repositorio canónico name y apparent repo nombre.

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 se incluirán en <workspace root>/vendor_src/rules_cc~

Dependencias externas del proveedor para objetivos determinados

Para suministrar todas las dependencias externas necesarias para crear patrones de destino determinados, puedes ejecutar bazel vendor <target patterns>.

Por ejemplo:

bazel vendor --vendor_dir=vendor_src //src/main:hello-world //src/test/...

se proporcionarán todos los repositorios necesarios para crear 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 el de destino, por lo que las marcas de compilación podrían aplicarse a este comando 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 limpio y sin acceso a la red. en la caché del repositorio.

Por lo tanto, debes poder registrar la fuente del proveedor y crear la misma se orienta 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 ejecuta 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 repo canónicos como argumentos:

  • ignore(): Para ignorar por completo un repositorio del modo de proveedor.
  • pin(): Para fijar un repositorio a su fuente proveedora actual como si hubiera un La marca --override_repository de este repositorio. Bazel NO actualizará Es la fuente de este repositorio mientras se 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 de proveedores.
  • El usuario puede modificar de forma segura la fuente proveedora de bazel_skylib.
  • Para volver a proporcionar el proveedor bazel_skylib, el usuario debe inhabilitar la declaración del pin. antes de empezar.

Comprende cómo funciona el modo de proveedor

Bazel recupera dependencias externas de un proyecto en $(bazel info output_base)/external. Proveer dependencias externas significa migrar archivos y directorios relevantes para el directorio del proveedor determinado y usa el y 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 de marcador que se proporciona está actualizado o el repo está fijada en el archivo VENDOR.bazel y, luego, Bazel crea la fuente proporcionada un symlink a él en $(bazel info output_base)/external en lugar de hacerlo ejecuta la regla del repositorio. De lo contrario, se imprimirá una advertencia y Bazel como resguardo para recuperar la versión más reciente del repositorio.

Archivos de registro de proveedores

Bazel debe realizar la resolución del módulo de Bazel para recuperar datos externos. dependencias, que pueden requerir acceso a archivos de registro por Internet. Para lograr la compilación sin conexión, proveedores de Bazel con todos los archivos de registro recuperados de en el directorio <vendor_dir>/_registries.

Los repositorios externos pueden contener symlinks que apuntan a otros archivos o directorios. Para asegurarse de que los symlinks funcionen correctamente, Bazel usa lo siguiente: para reescribir symlinks en la fuente proporcionada:

  • Crea un symlink <vendor_dir>/bazel-external que apunte a $(bazel info output_base)/external. Se actualiza con cada comando de Bazel automáticamente.
  • Para la fuente proporcionada, vuelve a escribir todos los symlinks que originalmente apuntan a un 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 reescribirá 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

Como Bazel genera automáticamente <vendor_dir>/bazel-external, es se recomienda agregarlo a .gitignore o un elemento equivalente para evitar registrarlo.

Con esta estrategia, los symlinks en la fuente proveedora deberían funcionar correctamente incluso después de que la fuente proveedora se traslada a otra ubicación o a la base de salida de Bazel un cambio.