Compartir a través de


Guía de solución de problemas de almacenamiento en caché binario

Esta guía está pensada para los usuarios que experimentan problemas con el almacenamiento en caché binario.

Habilitación de la información de depuración de vcpkg

Se recomienda encarecidamente habilitar la salida de depuración al seguir esta guía.

  • Modo clásico: agregue --debug a la invocación de comandos.
  • Cadena de herramientas de CMake: agregue -DVCPKG_INSTALL_OPTIONS="--debug" la llamada de configuración de CMake o en el CMakePresets.json archivo.
  • MSBuild/Visual Studio: establezca la propiedad VcpkgAdditionalInstallOptions en --debug.
  • Establezca la variable de entorno VCPKG_INSTALL_OPTIONS en --debug.

Error al insertar NuGet en {url}

Importante

Actualice la herramienta vcpkg a la versión más reciente. Además, habilite la salida de depuración para registros de errores completos.

Cuando se usa un origen binario de NuGet, aparece el siguiente error:

Pushing NuGet to {url} failed. Use --debug for more information.

Cuando se usa un origen binario del archivo de configuración de NuGet, aparece el siguiente error:

Pushing NuGet config to {url} failed. Use --debug for more information.

Este error se produce cuando vcpkg intenta y no puede usar la línea de comandos de NuGet para cargar paquetes en una fuente de NuGet.

Causa 1: Permisos de escritura de usuario insuficientes

Aparece el siguiente mensaje de error:

System.Net.Http.HttpRequestException: Response status code does not indicate success: 403 (Forbidden - User <user> lacks permission to complete this action. You need to have 'AddPackage'.

El origen remoto rechazó la inserción porque el usuario no tiene permisos de escritura suficientes.

  • Confirme que el usuario o grupo de usuarios tiene permisos de escritura. En NuGet, el usuario debe ser al menos un rol Colaborador en la fuente.

Causa 2: Dirección URL de fuente de NuGet mal configurada

Es posible que vea el error:

System.Net.Http.HttpRequestException: Response status code does not indicate success: 405 (Method Not Allowed).

El servidor rechazó la solicitud de inserción de NuGet porque no reconoció el método de solicitud.

  • Compruebe que el URI del origen binario es correcto y que dirige al índice de servicio de la fuente, normalmente <feed base url>/nuget/v3/index.json.

Recursos de NuGet adicionales

Consulte la documentación de NuGet para obtener instrucciones sobre cómo conectarse a una fuente de NuGet y publicarla.

Errores de carga de caché

Importante

Actualice la herramienta vcpkg a la versión más reciente. Además, habilite la salida de depuración para registros de errores completos.

Se producen errores al cargar un paquete binario en la memoria caché.

Causa 1: El proveedor de caché binaria no se pudo cargar

Las cargas pueden producir errores por diversos motivos y los mensajes de error suelen ser específicos del proveedor.

  • Asegúrese de que está autenticado en la memoria caché. Los distintos proveedores se autentican de forma diferente.
  • Compruebe si ha especificado el URI correcto para la memoria caché.
  • Consulte solución de problemas de inserción si usa NuGet como origen binario.
  • Revise la documentación o la guía de solución de problemas de su proveedor específico.

Caché binaria vacía

Importante

Actualice la herramienta vcpkg a la versión más reciente. Además, habilite la salida de depuración para registros de errores completos.

Aunque no se produjo ningún error y la instalación de vcpkg se realizó correctamente, la caché binaria permanece vacía. Si ha observado errores, consulte la solución de problemas de inserción para NuGet y cargue la solución de problemas para otros proveedores.

Causa 1: vcpkg carece de permisos de escritura en la caché binaria

Falta el mensaje siguiente en la salida.

Uploading binaries for 'rapidjson:x64-windows' to <binary source> source <url>.
Stored binaries in 1 destinations in 1.5 s.

vcpkg omitió la carga del paquete binario en la memoria caché binaria.

Recompilación de bibliotecas en lugar de usar la caché binaria remota

Importante

Actualice la herramienta vcpkg a la versión más reciente. Además, habilite la salida de depuración para registros de errores completos.

El sistema vuelve a generar bibliotecas localmente, incluso cuando el paquete binario necesario está disponible en la caché binaria remota.

Falta el mensaje siguiente en la salida.

Restored 1 package(s) from <remote binary cache> in 1.1 s. Use --debug to see more details.

Causa 1: vcpkg carece de permisos de lectura de la caché binaria remota

vcpkg elige leer la caché binaria predeterminada en la remota.

Causa 2: La caché binaria remota está vacía

La caché remota debe contener una lista de paquetes binarios que ha insertado.

Causa 3: Diferencias entre entornos de compilación locales y remotos

Cada paquete de la caché binaria se etiqueta con un hash abi que contiene versiones del compilador, orígenes y otra información para distinguir entre paquetes binarios. Si el hash abi calculado localmente no coincide con el almacenado de forma remota, el paquete no se recupera.

  • Consulte la guía de solución de problemas de coincidencia de hash de ABI para determinar la causa principal.

Recompilaciones de biblioteca inesperadas o frecuentes

Importante

Actualice la herramienta vcpkg a la versión más reciente. Además, habilite la salida de depuración para registros de errores completos.

En un entorno sin cambios y sin actualizar vcpkg, todavía se encuentran recompilaciones de bibliotecas occassionally.

Causa 1: Cambios no detectados en el entorno de compilación

Cada paquete de la caché binaria se etiqueta con un hash abi que contiene versiones del compilador, orígenes y otra información para distinguir entre paquetes binarios. Si el hash abi calculado localmente no coincide con el almacenado de forma remota, el paquete no se recupera.

  • Consulte la guía de solución de problemas de coincidencia de hash de ABI para determinar la causa principal.

Solución de problemas de coincidencia de hash de ABI

Importante

Actualice la herramienta vcpkg a la versión más reciente. Además, habilite la salida de depuración para registros de errores completos.

Esta guía está pensada para que los usuarios diagnostiquen por qué tienen diferentes hash de ABI para dos paquetes binarios con nombre idéntico.

Comparación de dos paquetes binarios

Determinar la diferencia entre dos paquetes con nombre idéntico requiere comparar varios datos: orígenes, versiones de herramientas, compiladores y plataformas de destino. El hash abi proporciona una representación concisa de estos datos. Al calcular un hash de ABI, vcpkg tiene en cuenta todos los datos pertinentes, incluidos el contenido del archivo, las versiones de las herramientas y los detalles del sistema. Crea un hash para cada punto de datos y, a continuación, combina estos hash en un solo valor para el paquete binario.

Comparación de hash abi del paquete binario

El hash abi de la biblioteca zlib es bb1c96759ac96102b4b18215db138daedd3eb16c2cd3302ae7bffab2b643eb87:

[DEBUG] Trying to hash <path>\buildtrees\zlib\x86-windows.vcpkg_abi_info.txt
[DEBUG] <path>\buildtrees\zlib\x86-windows.vcpkg_abi_info.txt has hash bb1c96759ac96102b4b18215db138daedd3eb16c2cd3302ae7bffab2b643eb87

Si el hash cambia entre ejecuciones para la misma biblioteca, esto indica que los dos paquetes son distintos.

Comparación de hash abi de la versión del compilador

Compruebe si la versión del compilador ha cambiado entre ejecuciones.

[DEBUG] -- The C compiler identification is MSVC 19.36.32538.0
[DEBUG] -- The CXX compiler identification is MSVC 19.36.32538.0
[DEBUG] #COMPILER_HASH#f5d02a6542664cfbd4a38db478133cbb1a18f315

El hash del compilador es f5d02a6542664cfbd4a38db478133cbb1a18f315.

Comparación de entradas hash de ABI

Compare las entradas de ABI para cada paquete. Una entrada representa un fragmento de información que contribuye al hash final.

[DEBUG] <abientries for zlib:x86-windows>
[DEBUG]   0001-Prevent-invalid-inclusions-when-HAVE_-is-set-to-0.patch|750b9542cb55e6328cca01d3ca997f1373b9530afa95e04213168676936e7bfa
[DEBUG]   0002-skip-building-examples.patch|835ddecfed752e0f49be9b0f8ff7ba76541cb0a150044327316e22ca84f8d0c2
[DEBUG]   0003-build-static-or-shared-not-both.patch|d6026271dcb3d8fc74b41e235620ae31576a798e77aa411c3af8cd9e948c02b1
[DEBUG]   0004-android-and-mingw-fixes.patch|37a43eddbcb1b7dde49e7659ae895dfd0ff1df66666c1371ba7d5bfc49d8b438
[DEBUG]   cmake|3.26.2
[DEBUG]   features|core
[DEBUG]   portfile.cmake|ac63047b644fa758860dd7ba48ff9a13b058c6f240b8e8d675b8fbba035976be
[DEBUG]   ports.cmake|5a8e00cedff0c898b1f90f7d129329d0288801bc9056562b039698caf31ff3f3
[DEBUG]   post_build_checks|2
[DEBUG]   powershell|7.3.6
[DEBUG]   triplet|x86-windows
[DEBUG]   triplet_abi|3e71dd1d4afa622894ae367adbbb1ecbd42c57c51428a86b675fa1c8cad3a581-36b818778ba6f2c16962495caedb9a7b221d5be4c60de1cd3060f549319a9931-f5d02a6542664cfbd4a38db478133cbb1a18f315
[DEBUG]   usage|be22662327df993eebc437495add75acb365ab18d37c7e5de735d4ea4f5d3083
[DEBUG]   vcpkg-cmake|1b3dac4b9b0bcbef227c954b495174863feebe3900b2a6bdef0cd1cf04ca1213
[DEBUG]   vcpkg-cmake-wrapper.cmake|5d49ef2ee6448479c2aad0e5f732e2676eaba0411860f9bebabe6002d66f57d1
[DEBUG]   vcpkg.json|bc94e2540efabe36130a806381a001c57194e7de67454ab7ff1e30aa15e6ce23
[DEBUG]   vcpkg_copy_pdbs|d57e4f196c82dc562a9968c6155073094513c31e2de475694143d3aa47954b1c
[DEBUG]   vcpkg_fixup_pkgconfig|588d833ff057d3ca99c14616c7ecfb5948b5e2a9e4fc02517dceb8b803473457
[DEBUG]   vcpkg_from_git|8f27bff0d01c6d15a3e691758df52bfbb0b1b929da45c4ebba02ef76b54b1881
[DEBUG]   vcpkg_from_github|b743742296a114ea1b18ae99672e02f142c4eb2bef7f57d36c038bedbfb0502f
[DEBUG]   vcpkg_replace_string|d43c8699ce27e25d47367c970d1c546f6bc36b6df8fb0be0c3986eb5830bd4f1
[DEBUG] </abientries>

Nota:

La triplet_abi entrada contiene tres hashes: el hash del contenido del archivo del x86-windows triplet, la windows.cmake cadena de herramientas y el hash del compilador. Estos hash cambiarían si decide establecer como destino una plataforma diferente.

Error de coincidencia 1: Archivos de puerto

Los archivos de puerto incluyen scripts de puerto (portfile.cmake, vcpkg.json), archivos de revisión (*.patch) o cualquier otro archivo en el directorio de puertos: ports/<library>/*.

Causa 1: CI o canalización actualizada el catálogo de puertos

Antes de que vcpkg se ejecutara en la CI, clonaba el repositorio vcpkg más reciente.

  • Al usar git clone https://github.com/microsoft/vcpkg seguido del bootstrap script, asegúrese de realizar la compra en una confirmación específica.
  • Considere la posibilidad de agregar vcpkg como submódulo git al proyecto.

Causa 2: Acciones de GitHub actualizadas vcpkg

Está usando la copia del sistema de vcpkg proporcionada por Acciones de GitHub, que se actualizó.

  • Clone su propia copia de vcpkg.
  • Considere la posibilidad de convertir vcpkg en un submódulo git en el proyecto.

Error de coincidencia 2: funciones auxiliares de CMake de vcpkg

Las funciones auxiliares de CMake residen en el directorio de scripts: scripts/*, y normalmente empiezan por vcpkg_.

Causa 1: Scripts auxiliares actualizados de CI o canalización

Antes de que vcpkg se ejecutara en la CI, clonaba el repositorio vcpkg más reciente.

  • Al usar git clone https://github.com/microsoft/vcpkg seguido del bootstrap script, asegúrese de realizar la compra en una confirmación específica.
  • Considere la posibilidad de agregar vcpkg como submódulo git al proyecto.

Causa 2: Acciones de GitHub actualizadas vcpkg

Está usando la copia del sistema de vcpkg proporcionada por Acciones de GitHub, que se actualizó.

  • Clone su propia copia de vcpkg.
  • Considere la posibilidad de convertir vcpkg en un submódulo git en el proyecto.

Error de coincidencia 3: versión del compilador

vcpkg recompiló las dependencias con una versión diferente del compilador.

Causa 1: el compilador de Visual Studio C++ se actualizó automáticamente.

Visual Studio actualizó automáticamente la carga de trabajo de C++, incluido el compilador, entre ejecuciones. Incluso las actualizaciones de versiones secundarias provocarán que vcpkg recompile el conjunto de bibliotecas.

Causa 2: la biblioteca se creó en una máquina diferente de la que usó para consumirla.

Una máquina creó y publicó el paquete binario en una caché remota. Otra máquina que se usa normalmente para el desarrollo consume la biblioteca almacenada en caché.

  • Use la misma versión del compilador de C++ localmente que en el equipo remoto. Para Visual Studio, considere un programa previo de versión fija.
  • Recompile las dependencias localmente con fines de desarrollo. Pruebe y solucione los problemas más adelante durante la integración continua.

Causa 3: la imagen autohospedada actualizó el compilador.

La imagen subyacente que usó para compilar dependencias de vcpkg cambió, que actualizó la versión del compilador.

  • Ancle a una imagen estable y con versiones. Asegúrese de no capturar la imagen más reciente para que no actualice automáticamente las herramientas o compiladores subyacentes entre ejecuciones.
  • Si necesita actualizar la imagen con frecuencia, ancle las herramientas del compilador de C++ a una versión específica al crear la imagen.

Causa 4: Los ejecutores hospedados de GitHub actualizaron el compilador subyacente.

Los ejecutores hospedados de GitHub actualizan compiladores y herramientas semanalmente.

  • Actualmente, no hay ninguna manera de corregir la imagen y evitar que las herramientas y la versión del compilador se actualicen periódicamente. Consulte la otra sección de opciones para ver soluciones alternativas.

Error de coincidencia 4: la versión de las herramientas cambió entre ejecuciones.

La versión de las herramientas que se usan para compilar las bibliotecas, CMake o PowerShell, ha cambiado entre ejecuciones.

Causa 1: Visual Studio se actualizó automáticamente.

Visual Studio se actualizó automáticamente, incluidas las herramientas, entre ejecuciones. Incluso las actualizaciones de versiones secundarias provocarán que vcpkg recompile el conjunto de bibliotecas.

  • Deshabilite las actualizaciones automáticas de Visual Studio.
  • Agregue --x-abi-tools-use-exact-versions a la invocación vcpkg. Esto corrige la ABI de las herramientas en función de la versión de vcpkgTools.xml; vcpkg captura su propia copia si es necesario.

Causa 2: la biblioteca se creó en una máquina diferente de la que usó para consumirla.

Una máquina creó y publicó el paquete binario en una caché remota. Otra máquina que se usa normalmente para el desarrollo consume la biblioteca almacenada en caché.

  • Use las mismas versiones de herramientas localmente que en el equipo remoto.
  • Recompile las dependencias localmente con fines de desarrollo. Pruebe y solucione los problemas más adelante durante la integración continua.
  • Agregue --x-abi-tools-use-exact-versions a la invocación vcpkg. Esto corrige la ABI de las herramientas en función de la versión de vcpkgTools.xml; vcpkg captura su propia copia si es necesario.

Causa 3: la imagen autohospedada actualizó las herramientas.

La imagen subyacente que usó para compilar dependencias de vcpkg cambió, que las versiones de las herramientas usadas.

  • Ancle a una imagen estable y con versiones. Asegúrese de no capturar la imagen más reciente para que no actualice automáticamente las herramientas subyacentes entre ejecuciones.
  • Si necesita actualizar la imagen con frecuencia, ancle las herramientas pertinentes a una versión específica al crear la imagen.
  • Agregue --x-abi-tools-use-exact-versions a la invocación vcpkg. Esto corrige la ABI de las herramientas en función de la versión de vcpkgTools.xml; vcpkg captura su propia copia si es necesario.

Causa 4: Los ejecutores hospedados de GitHub actualizaron las herramientas subyacentes.

Los ejecutores hospedados de GitHub actualizan compiladores y herramientas semanalmente.

  • Agregue --x-abi-tools-use-exact-versions a la invocación vcpkg. Esto corrige la ABI de las herramientas en función de la versión de vcpkgTools.xml; vcpkg captura su propia copia si es necesario.

Otras opciones

Si las opciones anteriores no funcionan, tenga en cuenta las siguientes soluciones alternativas:

  • Use vcpkg export para generar un archivo independiente de las dependencias en lugar de restaurarlas desde un manifiesto.
  • Considere la posibilidad de usar una imagen autohospedada de Docker para compilar las bibliotecas.
  • Tener una ejecución de integración continua auxiliar que compile bibliotecas de vcpkg en una cadencia regular (por ejemplo, diaria o semanal)

El problema no aparece aquí

Si el problema no aparece aquí, visite nuestro repositorio para crear un nuevo problema.