Udostępnij za pośrednictwem


Przewodnik rozwiązywania problemów z buforowaniem binarnym

Ten przewodnik jest przeznaczony dla użytkowników, którzy napotykają problemy z buforowaniem binarnym.

Włączanie informacji o debugowaniu programu vcpkg

Zdecydowanie zaleca się włączenie danych wyjściowych debugowania podczas wykonywania instrukcji w tym przewodniku.

  • Tryb klasyczny: dodaj --debug do wywołania polecenia.
  • Łańcuch narzędzi narzędzia CMake: dodaj -DVCPKG_INSTALL_OPTIONS="--debug" w narzędziu CMake wywołanie lub w CMakePresets.json pliku.
  • MSBuild/Visual Studio: ustaw właściwość VcpkgAdditionalInstallOptions na --debug.
  • Ustaw zmienną środowiskową VCPKG_INSTALL_OPTIONS na --debug.

Wypychanie nuGet do {url} kończy się niepowodzeniem

Ważne

Zaktualizuj narzędzie vcpkg do najnowszej wersji. Ponadto włącz dane wyjściowe debugowania, aby uzyskać kompleksowe dzienniki błędów.

W przypadku korzystania ze źródła binarnego NuGet pojawia się następujący błąd:

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

W przypadku korzystania ze źródła binarnego pliku konfiguracji NuGet pojawia się następujący błąd:

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

Ten błąd występuje, gdy program vcpkg próbuje użyć wiersza polecenia NuGet do przekazania pakietów do źródła danych NuGet.

Przyczyna 1. Niewystarczające uprawnienia do zapisu użytkownika

Zostanie wyświetlony następujący komunikat o błędzie:

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

Wypychanie zostało odrzucone przez zdalne źródło, ponieważ użytkownik nie ma wystarczających uprawnień do zapisu.

  • Upewnij się, że użytkownik lub grupa użytkowników ma uprawnienia do zapisu. W programie NuGet użytkownik musi być co najmniej rolą Współautor do kanału informacyjnego.

Przyczyna 2. Nieprawidłowo skonfigurowany adres URL kanału informacyjnego NuGet

Może zostać wyświetlony błąd:

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

Serwer odrzucił żądanie wypychania NuGet, ponieważ nie rozpoznał metody żądania.

  • Sprawdź, czy identyfikator URI w źródle binarnym jest poprawny i że kieruje do indeksu usługi kanału informacyjnego, zazwyczaj <feed base url>/nuget/v3/index.json.

Dodatkowe zasoby NuGet

Zapoznaj się z dokumentacją narzędzia NuGet, aby uzyskać wskazówki dotyczące nawiązywania połączenia z kanałem informacyjnym NuGet i publikowania go.

Błędy przekazywania pamięci podręcznej

Ważne

Zaktualizuj narzędzie vcpkg do najnowszej wersji. Ponadto włącz dane wyjściowe debugowania, aby uzyskać kompleksowe dzienniki błędów.

Występują błędy podczas przekazywania pakietu binarnego do pamięci podręcznej.

Przyczyna 1. Nie można przekazać dostawcy binarnej pamięci podręcznej

Przekazywanie może zakończyć się niepowodzeniem z różnych powodów, a komunikaty o błędach są zwykle specyficzne dla dostawcy.

Pusta pamięć podręczna binarna

Ważne

Zaktualizuj narzędzie vcpkg do najnowszej wersji. Ponadto włącz dane wyjściowe debugowania, aby uzyskać kompleksowe dzienniki błędów.

Mimo że nie wystąpiły żadne błędy, a instalacja programu vcpkg zakończyła się pomyślnie, pamięć podręczna binarna pozostaje pusta. Jeśli zaobserwowano błędy, zapoznaj się z rozwiązywaniem problemów z wypychaniem dla narzędzia NuGet i przekaż rozwiązywanie problemów z innymi dostawcami.

Przyczyna 1: vcpkg nie ma uprawnień do zapisu w pamięci podręcznej binarnej

W danych wyjściowych brakuje następującego komunikatu.

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

Narzędzie vcpkg pominąło przekazywanie pakietu binarnego do pamięci podręcznej binarnej.

  • Upewnij się, że konfiguracja binarnej pamięci podręcznej jest ustawiona na write lub readwrite

Ponowne kompilowanie bibliotek zamiast używania zdalnej pamięci podręcznej binarnej

Ważne

Zaktualizuj narzędzie vcpkg do najnowszej wersji. Ponadto włącz dane wyjściowe debugowania, aby uzyskać kompleksowe dzienniki błędów.

System ponownie kompiluje biblioteki lokalnie, nawet jeśli wymagany pakiet binarny jest dostępny w zdalnej pamięci podręcznej binarnej.

W danych wyjściowych brakuje następującego komunikatu.

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

Przyczyna 1: program vcpkg nie ma uprawnień do odczytu z zdalnej pamięci podręcznej binarnej

vcpkg wybierz odczyt domyślnej pamięci podręcznej binarnej za pośrednictwem zdalnej.

  • Upewnij się, że konfiguracja binarnej pamięci podręcznej jest ustawiona na read lub readwrite

Przyczyna 2. Zdalna pamięć podręczna binarna jest pusta

Zdalna pamięć podręczna powinna zawierać listę wypchniętych pakietów binarnych.

Przyczyna 3: Różnice między lokalnymi i zdalnymi środowiskami kompilacji

Każdy pakiet w pamięci podręcznej binarnej ma etykietę skrótu ABI, który zawiera wersje kompilatora, źródła i inne informacje umożliwiające rozróżnienie między pakietami binarnymi. Jeśli lokalnie obliczony skrót ABI nie jest zgodny z tym, który jest przechowywany zdalnie, pakiet nie jest pobierany.

  • Zapoznaj się z przewodnikiem rozwiązywania problemów z niezgodnością skrótów usługi ABI, aby ustalić główną przyczynę.

Nieoczekiwane lub częste ponowne kompilowanie biblioteki

Ważne

Zaktualizuj narzędzie vcpkg do najnowszej wersji. Ponadto włącz dane wyjściowe debugowania, aby uzyskać kompleksowe dzienniki błędów.

W niezmienionym środowisku i bez aktualizowania programu vcpkg nadal można odbudować biblioteki bez zmian.

Przyczyna 1: Niezakryte zmiany w środowisku kompilacji

Każdy pakiet w pamięci podręcznej binarnej ma etykietę skrótu ABI, który zawiera wersje kompilatora, źródła i inne informacje umożliwiające rozróżnienie między pakietami binarnymi. Jeśli lokalnie obliczony skrót ABI nie jest zgodny z tym, który jest przechowywany zdalnie, pakiet nie jest pobierany.

  • Zapoznaj się z przewodnikiem rozwiązywania problemów z niezgodnością skrótów usługi ABI, aby ustalić główną przyczynę.

Rozwiązywanie problemów z niezgodnością skrótów usługi ABI

Ważne

Zaktualizuj narzędzie vcpkg do najnowszej wersji. Ponadto włącz dane wyjściowe debugowania, aby uzyskać kompleksowe dzienniki błędów.

Ten przewodnik jest przeznaczony dla użytkowników do diagnozowania, dlaczego mają różne skróty ABI dla dwóch identycznych pakietów binarnych.

Porównywanie dwóch pakietów binarnych

Określenie różnicy między dwoma identycznymi nazwami pakietami wymaga porównania różnych danych: źródeł, wersji narzędzi, kompilatorów i platform docelowych. Skrót ABI zapewnia zwięzłą reprezentację tych danych. Podczas obliczania skrótu ABI narzędzie vcpkg uwzględnia wszystkie istotne dane, w tym zawartość pliku, wersje narzędzi i szczegóły systemu. Tworzy skrót dla każdego punktu danych, a następnie łączy te skróty w jedną wartość dla pakietu binarnego.

Porównanie skrótów pakietu binarnego ABI

Skrót ABI biblioteki zlib to 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

Jeśli skrót zmienia się między przebiegami dla tej samej biblioteki, oznacza to, że dwa pakiety są odrębne.

Porównanie skrótów ABI wersji kompilatora

Sprawdź, czy wersja kompilatora zmieniła się między przebiegami.

[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

Skrót kompilatora to f5d02a6542664cfbd4a38db478133cbb1a18f315.

Porównanie pozycji skrótu ABI

Porównaj wpisy usługi ABI dla każdego pakietu. Wpis reprezentuje element informacji, który przyczynia się do ostatniego skrótu.

[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>

Uwaga

Wpis triplet_abi zawiera trzy skróty: skrót zawartości x86-windows pliku triplet, windows.cmake łańcuch narzędzi i skrót kompilatora. Te skróty zmienią się, jeśli zdecydujesz się na inną platformę.

Niezgodność 1: Pliki portów

Pliki portów obejmują skrypty portów (portfile.cmake, vcpkg.json), pliki poprawek (*.patch) lub dowolny inny plik w katalogu portów: ports/<library>/*.

Przyczyna 1. Ciągła integracja lub potok zaktualizował rejestr portów

Przed uruchomieniem narzędzia vcpkg w ciągłej integracji sklonował on najnowsze repozytorium vcpkg.

  • W przypadku używania git clone https://github.com/microsoft/vcpkg skryptu bootstrap upewnij się, że wyewidencjonujesz określone zatwierdzenie.
  • Rozważ dodanie narzędzia vcpkg jako modułu podrzędnego git do projektu.

Przyczyna 2. Zaktualizowano program vcpkg funkcji GitHub Actions

Używasz kopii systemowej narzędzia vcpkg dostarczonego przez funkcję GitHub Actions, która została zaktualizowana.

  • Sklonuj własną kopię pliku vcpkg.
  • Rozważ utworzenie modułu podrzędnego git vcpkg w projekcie.

Niezgodność 2: funkcje pomocnika narzędzia CMake vcpkg

Funkcje pomocnika narzędzia CMake znajdują się w katalogu scripts: scripts/*, i zwykle zaczynają się od vcpkg_.

Przyczyna 1. Zaktualizowano skrypty pomocnika ciągłej integracji lub potoku

Przed uruchomieniem narzędzia vcpkg w ciągłej integracji sklonował on najnowsze repozytorium vcpkg.

  • W przypadku używania git clone https://github.com/microsoft/vcpkg skryptu bootstrap upewnij się, że wyewidencjonujesz określone zatwierdzenie.
  • Rozważ dodanie narzędzia vcpkg jako modułu podrzędnego git do projektu.

Przyczyna 2. Zaktualizowano program vcpkg funkcji GitHub Actions

Używasz kopii systemowej narzędzia vcpkg dostarczonego przez funkcję GitHub Actions, która została zaktualizowana.

  • Sklonuj własną kopię pliku vcpkg.
  • Rozważ utworzenie modułu podrzędnego git vcpkg w projekcie.

Niezgodność 3: wersja kompilatora

Narzędzie vcpkg ponownie skompiluje zależności z inną wersją kompilatora.

Przyczyna 1. Kompilator visual Studio C++ został automatycznie zaktualizowany.

Program Visual Studio automatycznie zaktualizował obciążenie języka C++, w tym kompilator, między przebiegami. Nawet aktualizacje wersji pomocniczej spowodują ponowne skompilowanie zestawu bibliotek przez narzędzie vcpkg.

Przyczyna 2: Biblioteka została zbudowana na innej maszynie niż maszyna używana do jej użycia.

Jedna maszyna utworzyła i opublikowała pakiet binarny w zdalnej pamięci podręcznej. Inna maszyna zwykle używana do programowania używa buforowanej biblioteki.

  • Użyj tej samej wersji kompilatora języka C++ lokalnie, co na maszynie zdalnej. W przypadku programu Visual Studio rozważ użycie programu inicjjącego o stałej wersji.
  • Ponowne kompilowanie zależności lokalnie na potrzeby programowania. Testowanie i rozwiązywanie problemów później podczas ciągłej integracji.

Przyczyna 3. Obraz hostowany samodzielnie zaktualizował kompilator.

Obraz źródłowy użyty do skompilowania zależności narzędzia vcpkg został zmieniony, który zaktualizował wersję kompilatora.

  • Przypnij do stabilnego i wersjonowanego obrazu. Upewnij się, że nie pobierasz najnowszego obrazu, więc nie aktualizuje automatycznie podstawowych narzędzi ani kompilatorów między przebiegami.
  • Jeśli chcesz często aktualizować obraz, przypnij narzędzia kompilatora języka C++ do określonej wersji podczas tworzenia obrazu.

Przyczyna 4. Moduły uruchamiane w usłudze GitHub zaktualizowały podstawowy kompilator.

Hostowane moduły uruchamiające usługę GitHub aktualizują co tydzień kompilatory i narzędzia.

  • Obecnie nie ma możliwości naprawy obrazu i uniemożliwić okresowe aktualizowanie narzędzi i wersji kompilatora. Zobacz drugą sekcję opcji , aby zapoznać się z alternatywnymi rozwiązaniami.

Niezgodność 4: wersja narzędzi została zmieniona między przebiegami.

Wersja narzędzi używanych do kompilowania bibliotek, narzędzia CMake lub programu PowerShell została zmieniona między przebiegami.

Przyczyna 1. Program Visual Studio jest automatycznie aktualizowany.

Program Visual Studio został automatycznie zaktualizowany, w tym wszystkie narzędzia między przebiegami. Nawet aktualizacje wersji pomocniczej spowodują ponowne skompilowanie zestawu bibliotek przez narzędzie vcpkg.

  • Wyłącz automatyczne aktualizacje programu Visual Studio.
  • Dodaj --x-abi-tools-use-exact-versions do wywołania vcpkg. Spowoduje to poprawkę ABI narzędzi w oparciu o wersję w vcpkgTools.xmlpliku ; vcpkg pobiera własną kopię w razie potrzeby.

Przyczyna 2: Biblioteka została zbudowana na innej maszynie niż maszyna używana do jej użycia.

Jedna maszyna utworzyła i opublikowała pakiet binarny w zdalnej pamięci podręcznej. Inna maszyna zwykle używana do programowania używa buforowanej biblioteki.

  • Użyj tych samych wersji narzędzi lokalnie co na maszynie zdalnej.
  • Ponowne kompilowanie zależności lokalnie na potrzeby programowania. Testowanie i rozwiązywanie problemów później podczas ciągłej integracji.
  • Dodaj --x-abi-tools-use-exact-versions do wywołania vcpkg. Spowoduje to poprawkę ABI narzędzi w oparciu o wersję w vcpkgTools.xmlpliku ; vcpkg pobiera własną kopię w razie potrzeby.

Przyczyna 3. Obraz hostowany samodzielnie zaktualizował narzędzia.

Obraz źródłowy użyty do tworzenia zależności narzędzia vcpkg został zmieniony, który były używane wersje narzędzi.

  • Przypnij do stabilnego i wersjonowanego obrazu. Upewnij się, że nie pobierasz najnowszego obrazu, więc nie aktualizuje automatycznie podstawowych narzędzi między przebiegami.
  • Jeśli chcesz często aktualizować obraz, przypnij odpowiednie narzędzia do określonej wersji podczas tworzenia obrazu.
  • Dodaj --x-abi-tools-use-exact-versions do wywołania vcpkg. Spowoduje to poprawkę ABI narzędzi w oparciu o wersję w vcpkgTools.xmlpliku ; vcpkg pobiera własną kopię w razie potrzeby.

Przyczyna 4. Moduły uruchamiającego hostowane w usłudze GitHub zaktualizowały podstawowe narzędzia.

Hostowane moduły uruchamiające usługę GitHub aktualizują co tydzień kompilatory i narzędzia.

  • Dodaj --x-abi-tools-use-exact-versions do wywołania vcpkg. Spowoduje to poprawkę ABI narzędzi w oparciu o wersję w vcpkgTools.xmlpliku ; vcpkg pobiera własną kopię w razie potrzeby.

Inne opcje

Jeśli powyższe opcje nie działają, rozważ następujące obejścia:

  • Służy vcpkg export do tworzenia autonomicznego archiwum zależności zamiast przywracania ich z manifestu.
  • Rozważ użycie własnego obrazu platformy Docker do kompilowania bibliotek
  • Posiadanie pomocniczego przebiegu ciągłej integracji, który kompiluje biblioteki vcpkg w regularnym okresie (np. codziennie lub co tydzień)

Problem nie znajduje się tutaj

Jeśli problem nie jest wymieniony tutaj, odwiedź nasze repozytorium , aby utworzyć nowy problem.