Modo de proveedor

Informar un problema Ver fuente Nightly · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

El modo de proveedor es una función 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.

Cómo habilitar el modo de proveedor

Puedes habilitar el modo de proveedor especificando la marca --vendor_dir.

Por ejemplo, agrégala 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 espacio 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 se debe incluir. Acepta tanto el nombre canónico del repositorio como el nombre aparente del repositorio.

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+

hará que rules_cc se venda bajo <workspace root>/vendor_src/rules_cc+.

Dependencias externas del proveedor para los objetivos determinados

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

Por ejemplo:

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

Incluirá todos los repositorios necesarios para compilar el destino //src/main:hello-world 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 se podrían aplicar marcas de compilación a este comando y afectar el resultado.

Compila el destino sin conexión

Con las dependencias externas incluidas en el 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 registrar el código fuente incluido y compilar los mismos destinos sin conexión en otra máquina.

Incluye todas las dependencias externas

Para incluir todos los repositorios en tu gráfico de dependencias externas transitivas, puedes ejecutar el siguiente comando:

bazel vendor --vendor_dir=vendor_src

Ten en cuenta que incluir todas las dependencias tiene algunas desventajas:

  • Recuperar todos los repositorios, incluidos los que se introdujeron de forma transitiva, puede llevar mucho tiempo.
  • El directorio del proveedor puede volverse muy grande.
  • Es posible que no se puedan recuperar algunos repositorios si no son compatibles con la plataforma o el entorno actuales.

Por lo tanto, primero considera la posibilidad de contratar proveedores para objetivos específicos.

Cómo configurar 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 vendor.

Hay dos directivas disponibles, ambas aceptan una lista de nombres de repositorios canónicos como argumentos:

  • ignore(): Ignorar por completo un repositorio del modo de proveedor
  • pin(): Para fijar un repositorio en su fuente actual incluida como proveedor, como si hubiera una marca --override_repository para este repositorio. Bazel NO actualizará la fuente externa de este repo mientras se ejecute el comando vendor, a menos que se quite la fijación. El usuario puede modificar y mantener la fuente externa de este repo de forma manual.

Por ejemplo:

ignore("@@rules_cc+")
pin("@@bazel_skylib+")

Con esta configuración

  • Ambos repositorios se excluirán de los comandos posteriores del proveedor.
  • El repo bazel_skylib se anulará con la fuente ubicada en el directorio vendor.
  • El usuario puede modificar de forma segura la fuente proporcionada de bazel_skylib.
  • Para volver a vender bazel_skylib, el usuario primero debe inhabilitar la declaración de fijación.

Cómo funciona el modo de proveedor

Bazel recupera las dependencias externas de un proyecto en $(bazel info output_base)/external. Incluir dependencias externas significa mover los archivos y directorios pertinentes al directorio de proveedores determinado y usar el código fuente incluido para compilaciones posteriores.

El contenido que se vende incluye lo siguiente:

  • El directorio del repositorio
  • El archivo de marcador del repo

Durante una compilación, si el archivo de marcador incluido está actualizado o el repo está fijado en el archivo VENDOR.bazel, Bazel usa el código fuente incluido creando un vínculo simbólico a él 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 la recuperación de la versión más reciente del repo.

Archivos de registro de proveedores

Bazel debe realizar la resolución de módulos 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 incluye todos los archivos de registro recuperados de la red en el directorio <vendor_dir>/_registries.

Los repositorios externos pueden contener vínculos simbólicos que apunten a otros archivos o directorios. Para asegurarse de que los symlinks funcionen correctamente, Bazel usa la siguiente estrategia para reescribir los symlinks en el código fuente incluido:

  • Crea un symlink <vendor_dir>/bazel-external que apunte a $(bazel info output_base)/external. Se actualiza automáticamente con cada comando de Bazel.
  • En el caso de la fuente incluida, reescribe todos los vínculos simbólicos 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 vínculo simbólico original es

<vendor_dir>/repo_foo+/link  =>  $(bazel info output_base)/external/repo_bar+/file

Se reescribirá como

<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 a un elemento equivalente para evitar su registro.

Con esta estrategia, las vinculaciones simbólicas 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.