Condividi tramite


Guida alla risoluzione dei problemi di memorizzazione nella cache binaria

Questa guida è destinata agli utenti che riscontrano problemi con la memorizzazione nella cache binaria.

Abilitare le informazioni di debug di vcpkg

È consigliabile abilitare l'output di debug quando si segue questa guida.

  • Modalità classica: aggiungere --debug alla chiamata al comando.
  • Toolchain CMake: aggiungere -DVCPKG_INSTALL_OPTIONS="--debug" nella chiamata di configurazione di CMake o nel CMakePresets.json file.
  • MSBuild/Visual Studio: impostare la proprietà VcpkgAdditionalInstallOptions su --debug.
  • Impostare la variabile di ambiente VCPKG_INSTALL_OPTIONS su --debug.

Errore di push nuGet in {url}

Importante

Aggiornare lo strumento vcpkg alla versione più recente. Inoltre, abilitare l'output di debug per i log degli errori completi.

Quando si usa un'origine binaria NuGet viene visualizzato l'errore seguente:

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

Quando si usa un'origine binaria del file di configurazione NuGet, viene visualizzato l'errore seguente:

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

Questo errore si verifica quando vcpkg tenta e non usa la riga di comando NuGet per caricare i pacchetti in un feed NuGet.

Causa 1: Autorizzazioni di scrittura utente insufficienti

Viene visualizzato il messaggio di errore seguente:

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'.

Il push è stato rifiutato dall'origine remota perché l'utente non dispone di autorizzazioni di scrittura sufficienti.

  • Verificare che l'utente o il gruppo di utenti disponga delle autorizzazioni di scrittura. In NuGet l'utente deve essere almeno un ruolo Collaboratore al feed.

Causa 2: URL del feed NuGet configurato in modo errato

È possibile che venga visualizzato l'errore:

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

Il server ha rifiutato la richiesta push di NuGet perché non ha riconosciuto il metodo di richiesta.

  • Verificare che l'URI nell'origine binaria sia corretto e che indirizza all'indice del servizio del feed, in <feed base url>/nuget/v3/index.jsongenere .

Risorse NuGet aggiuntive

Consultare la documentazione di NuGet per indicazioni sulla connessione e la pubblicazione in un feed NuGet.

Errori di caricamento della cache

Importante

Aggiornare lo strumento vcpkg alla versione più recente. Inoltre, abilitare l'output di debug per i log degli errori completi.

Si verificano errori durante il caricamento di un pacchetto binario nella cache.

Causa 1: Impossibile caricare il provider di cache binaria

I caricamenti possono non riuscire per diversi motivi e i messaggi di errore sono in genere specifici del provider.

  • Assicurarsi di essere autenticati nella cache. Provider diversi eseguono l'autenticazione in modo diverso.
  • Controllare se è stato specificato l'URI corretto per la cache.
  • Fare riferimento alla risoluzione dei problemi di push se si usa NuGet come origine binaria.
  • Esaminare la documentazione o la guida alla risoluzione dei problemi del provider specifico.

Cache binaria vuota

Importante

Aggiornare lo strumento vcpkg alla versione più recente. Inoltre, abilitare l'output di debug per i log degli errori completi.

Anche se non sono stati rilevati errori e l'installazione di vcpkg è riuscita, la cache binaria rimane vuota. Se si sono verificati errori, consultare la risoluzione dei problemi di push per NuGet e la risoluzione dei problemi di caricamento per altri provider.

Causa 1: vcpkg non dispone delle autorizzazioni di scrittura per la cache binaria

Nell'output manca il messaggio seguente.

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

vcpkg ha ignorato il caricamento del pacchetto binario nella cache binaria.

  • Verificare che la configurazione della cache binaria sia impostata su write oreadwrite

Le librerie ricompilano anziché usare la cache binaria remota

Importante

Aggiornare lo strumento vcpkg alla versione più recente. Inoltre, abilitare l'output di debug per i log degli errori completi.

Il sistema ricompila le librerie in locale, anche quando il pacchetto binario richiesto è disponibile nella cache binaria remota.

Nell'output manca il messaggio seguente.

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

Causa 1: vcpkg non dispone delle autorizzazioni di lettura dalla cache binaria remota

vcpkg scegliere di leggere la cache binaria predefinita su quella remota.

  • Verificare che la configurazione della cache binaria sia impostata su read oreadwrite

Causa 2: La cache binaria remota è vuota

La cache remota deve contenere un elenco di pacchetti binari di cui è stato eseguito il push.

Causa 3: Differenze tra ambienti di compilazione locali e remoti

Ogni pacchetto nella cache binaria viene etichettato con un hash ABI che contiene versioni del compilatore, origini e altre informazioni per distinguere i pacchetti binari. Se l'hash ABI calcolato in locale non corrisponde a quello archiviato in remoto, il pacchetto non viene recuperato.

  • Per determinare la causa radice, vedere la guida alla risoluzione dei problemi di mancata corrispondenza dell'hash ABI.

Ricompilazione imprevista o frequente della libreria

Importante

Aggiornare lo strumento vcpkg alla versione più recente. Inoltre, abilitare l'output di debug per i log degli errori completi.

In un ambiente invariato e senza aggiornare vcpkg, si trovano comunque a ricompilare le librerie in modo occassionato.

Causa 1: Modifiche non rilevate nell'ambiente di compilazione

Ogni pacchetto nella cache binaria viene etichettato con un hash ABI che contiene versioni del compilatore, origini e altre informazioni per distinguere i pacchetti binari. Se l'hash ABI calcolato in locale non corrisponde a quello archiviato in remoto, il pacchetto non viene recuperato.

  • Per determinare la causa radice, vedere la guida alla risoluzione dei problemi di mancata corrispondenza dell'hash ABI.

Risoluzione dei problemi relativi alla mancata corrispondenza dell'hash ABI

Importante

Aggiornare lo strumento vcpkg alla versione più recente. Inoltre, abilitare l'output di debug per i log degli errori completi.

Questa guida è destinata agli utenti per diagnosticare il motivo per cui hanno hash ABI diversi per due pacchetti binari denominati in modo identico.

Confronto di due pacchetti binari

Determinare la differenza tra due pacchetti denominati in modo identico richiede il confronto di varie origini dati, versioni degli strumenti, compilatori e piattaforme di destinazione. L'hash ABI fornisce una rappresentazione concisa di questi dati. Quando si calcola un hash ABI, vcpkg considera tutti i dati pertinenti, inclusi il contenuto dei file, le versioni degli strumenti e i dettagli di sistema. Crea un hash per ogni punto dati e quindi combina questi hash in un singolo valore per il pacchetto binario.

Confronto tra hash ABI del pacchetto binario

L'hash ABI della libreria zlib è 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

Se l'hash cambia tra le esecuzioni per la stessa libreria, ciò indica che i due pacchetti sono distinti.

Confronto tra hash ABI della versione del compilatore

Verificare se la versione del compilatore è cambiata tra le esecuzioni.

[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

L'hash del compilatore è f5d02a6542664cfbd4a38db478133cbb1a18f315.

Confronto delle voci hash ABI

Confrontare le voci ABI per ogni pacchetto. Una voce rappresenta una parte di informazioni che contribuisce all'hash finale.

[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 voce contiene tre hash: l'hash del contenuto del file del x86-windows triplet, la windows.cmake toolchain e l'hash del compilatore. Questi hash cambiano se si decide di scegliere come destinazione una piattaforma diversa.

Mancata corrispondenza 1: File di porta

I file di porta includono script di porta (portfile.cmake, vcpkg.json), file patch (*.patch) o qualsiasi altro file nella directory delle porte: ports/<library>/*.

Causa 1: INTEGRAZIONE continua o pipeline aggiornata il Registro di sistema delle porte

Prima dell'esecuzione di vcpkg nell'integrazione continua, è stato clonato il repository vcpkg più recente.

  • Quando si usa git clone https://github.com/microsoft/vcpkg seguito dallo bootstrap script, assicurarsi di eseguire il checkout in un commit specifico.
  • Prendere in considerazione l'aggiunta di vcpkg come modulo secondario Git al progetto.

Causa 2: GitHub Actions aggiornato vcpkg

Si usa la copia di sistema di vcpkg fornita da GitHub Actions, che è stata aggiornata.

  • Clonare la propria copia di vcpkg.
  • Prendere in considerazione la possibilità di creare vcpkg un modulo secondario Git nel progetto.

Mancata corrispondenza 2: funzioni helper CMake vcpkg

Le funzioni helper di CMake risiedono nella directory degli script: scripts/*e in genere iniziano con vcpkg_.

Causa 1: script helper aggiornati dell'integrazione continua o della pipeline

Prima dell'esecuzione di vcpkg nell'integrazione continua, è stato clonato il repository vcpkg più recente.

  • Quando si usa git clone https://github.com/microsoft/vcpkg seguito dallo bootstrap script, assicurarsi di eseguire il checkout in un commit specifico.
  • Prendere in considerazione l'aggiunta di vcpkg come modulo secondario Git al progetto.

Causa 2: GitHub Actions aggiornato vcpkg

Si usa la copia di sistema di vcpkg fornita da GitHub Actions, che è stata aggiornata.

  • Clonare la propria copia di vcpkg.
  • Prendere in considerazione la possibilità di creare vcpkg un modulo secondario Git nel progetto.

Mancata corrispondenza 3: versione del compilatore

vcpkg ricompila le dipendenze con una versione diversa del compilatore.

Causa 1: il compilatore C++ di Visual Studio viene aggiornato automaticamente.

Visual Studio ha aggiornato automaticamente il carico di lavoro C++, incluso il compilatore, tra le esecuzioni. Anche gli aggiornamenti delle versioni secondarie comportano la ricompilazione di vcpkg del set di librerie.

Causa 2: la libreria è stata compilata in un computer diverso da quello usato per utilizzarla.

Un computer ha creato e pubblicato il pacchetto binario in una cache remota. Un altro computer usato in genere per lo sviluppo ha utilizzato la libreria memorizzata nella cache.

  • Usare la stessa versione del compilatore C++ in locale del computer remoto. Per Visual Studio, prendere in considerazione un programma di avvio automatico della versione fissa.
  • Ricompilare le dipendenze in locale a scopo di sviluppo. Testare e risolvere i problemi in un secondo momento durante l'integrazione continua.

Causa 3: L'immagine self-hosted ha aggiornato il compilatore.

L'immagine sottostante usata per compilare le dipendenze vcpkg è stata modificata, che ha aggiornato la versione del compilatore.

  • Aggiungi a un'immagine stabile e con controllo delle versioni. Assicurarsi di non recuperare l'immagine più recente in modo che non aggiorni automaticamente gli strumenti o i compilatori sottostanti tra le esecuzioni.
  • Se è necessario aggiornare l'immagine di frequente, aggiungere gli strumenti del compilatore C++ a una versione specifica durante la creazione dell'immagine.

Causa 4: GitHub Hosted Runners ha aggiornato il compilatore sottostante.

Gli strumenti e i compilatori di GitHub ospitati aggiornano ogni settimana i compilatori e gli strumenti.

  • Attualmente, non è possibile correggere l'immagine e impedire l'aggiornamento periodico degli strumenti e della versione del compilatore. Vedere la sezione altre opzioni per soluzioni alternative.

Mancata corrispondenza 4: la versione degli strumenti è cambiata tra le esecuzioni.

La versione degli strumenti usata per compilare le librerie, CMake o PowerShell, cambia tra le esecuzioni.

Causa 1: Visual Studio aggiornato automaticamente.

Visual Studio viene aggiornato automaticamente, inclusi tutti gli strumenti, tra le esecuzioni. Anche gli aggiornamenti delle versioni secondarie comportano la ricompilazione di vcpkg del set di librerie.

  • Disabilitare gli aggiornamenti automatici di Visual Studio.
  • Aggiungere --x-abi-tools-use-exact-versions alla chiamata di vcpkg. In questo modo, l'interfaccia ABI degli strumenti viene risolta in base alla versione in vcpkgTools.xml; vcpkg recupera la propria copia, se necessario.

Causa 2: la libreria è stata compilata in un computer diverso da quello usato per utilizzarla.

Un computer ha creato e pubblicato il pacchetto binario in una cache remota. Un altro computer usato in genere per lo sviluppo ha utilizzato la libreria memorizzata nella cache.

  • Usare le stesse versioni degli strumenti in locale del computer remoto.
  • Ricompilare le dipendenze in locale a scopo di sviluppo. Testare e risolvere i problemi in un secondo momento durante l'integrazione continua.
  • Aggiungere --x-abi-tools-use-exact-versions alla chiamata di vcpkg. In questo modo, l'interfaccia ABI degli strumenti viene risolta in base alla versione in vcpkgTools.xml; vcpkg recupera la propria copia, se necessario.

Causa 3: l'immagine self-hosted ha aggiornato gli strumenti.

L'immagine sottostante usata per compilare le dipendenze vcpkg è cambiata, che le versioni di tutti gli strumenti usati.

  • Aggiungi a un'immagine stabile e con controllo delle versioni. Assicurarsi di non recuperare l'immagine più recente in modo che non aggiorni automaticamente gli strumenti sottostanti tra le esecuzioni.
  • Se è necessario aggiornare l'immagine di frequente, aggiungere eventuali strumenti pertinenti a una versione specifica durante la creazione dell'immagine.
  • Aggiungere --x-abi-tools-use-exact-versions alla chiamata di vcpkg. In questo modo, l'interfaccia ABI degli strumenti viene risolta in base alla versione in vcpkgTools.xml; vcpkg recupera la propria copia, se necessario.

Causa 4: Gli strumenti di esecuzione ospitati in GitHub hanno aggiornato gli strumenti sottostanti.

Gli strumenti e i compilatori di GitHub ospitati aggiornano ogni settimana i compilatori e gli strumenti.

  • Aggiungere --x-abi-tools-use-exact-versions alla chiamata di vcpkg. In questo modo, l'interfaccia ABI degli strumenti viene risolta in base alla versione in vcpkgTools.xml; vcpkg recupera la propria copia, se necessario.

Altre opzioni

Se le opzioni precedenti non funzionano, prendere in considerazione le soluzioni alternative seguenti:

  • Usare vcpkg export per produrre un archivio autonomo delle dipendenze anziché ripristinarle da un manifesto.
  • Prendere in considerazione l'uso di un'immagine self-hosted docker per creare le librerie
  • Eseguire un'integrazione continua ausiliaria che compila librerie vcpkg a cadenza regolare (ad esempio, giornaliera o settimanale)

Il problema non è riportato nell'elenco

Se il problema non è elencato qui, visitare il repository per creare un nuovo problema.