다음을 통해 공유


이진 캐싱 문제 해결 가이드

이 가이드는 이진 캐싱문제가 있는 사용자를 위한 것입니다.

vcpkg 디버깅 정보 사용

이 가이드에 따라 디버그 출력을 사용하도록 설정하는 것이 좋습니다.

  • 클래식 모드: 명령 호출에 추가 --debug 합니다.
  • CMake 도구 체인: CMake 구성 호출 또는 파일에 추가 -DVCPKG_INSTALL_OPTIONS="--debug" 합니다 CMakePresets.json .
  • MSBuild/Visual Studio: 속성을 VcpkgAdditionalInstallOptions .로 --debug설정합니다.
  • VCPKG_INSTALL_OPTIONS 환경 변수를 --debug으로 설정합니다.

{url}에 NuGet 푸시 실패

Important

vcpkg 도구를 최신 릴리스로 업데이트합니다. 또한 포괄적인 오류 로그에 대해 디버그 출력을 사용하도록 설정합니다.

NuGet 이진 원본을 사용하는 경우 다음 오류가 나타납니다.

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

NuGet 구성 파일 이진 원본을 사용하는 경우 다음 오류가 나타납니다.

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

이 오류는 vcpkg가 NuGet 명령줄을 사용하여 NuGet 피드에 패키지를 업로드하지 못할 때 발생합니다.

원인 1: 사용자 쓰기 권한이 부족합니다.

다음과 같은 오류 메시지가 표시됩니다.

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

사용자에게 충분한 쓰기 권한이 없기 때문에 원격 원본에서 푸시를 거부했습니다.

  • 사용자 또는 사용자 그룹에 쓰기 권한이 있는지 확인합니다. NuGet에서 사용자는 피드에 대한 기여자 역할 이상이어야 합니다.

원인 2: 잘못 구성된 NuGet 피드 URL

다음과 같은 오류가 표시될 수 있습니다.

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

서버는 요청 메서드를 인식하지 못해 NuGet의 푸시 요청을 거부했습니다.

  • 이진 소스의 URI가 올바르고 피드의 서비스 인덱스(일반적으로)로 전달되는지 확인합니다 <feed base url>/nuget/v3/index.json.

추가 NuGet 리소스

NuGet 피드에 연결하고 게시하는 방법에 대한 지침은 NuGet 설명서를 참조하세요.

캐시 업로드 오류

Important

vcpkg 도구를 최신 릴리스로 업데이트합니다. 또한 포괄적인 오류 로그에 대해 디버그 출력을 사용하도록 설정합니다.

캐시에 이진 패키지를 업로드하는 동안 오류가 발생합니다.

원인 1: 이진 캐시 공급자를 업로드하지 못했습니다.

업로드는 다양한 이유로 실패할 수 있으며 오류 메시지는 일반적으로 공급자별로 다릅니다.

  • 캐시에 인증되었는지 확인합니다. 다른 공급자는 다르게 인증합니다.
  • 캐시에 대한 올바른 URI를 지정했는지 확인합니다.
  • NuGet을 이진 원본으로 사용하는 경우 푸시 문제 해결을 참조하세요.
  • 설명서 또는 특정 공급자의 문제 해결 가이드를 검토합니다.

빈 이진 캐시

Important

vcpkg 도구를 최신 릴리스로 업데이트합니다. 또한 포괄적인 오류 로그에 대해 디버그 출력을 사용하도록 설정합니다.

오류가 발생하지 않았고 vcpkg 설치에 성공했지만 이진 캐시는 비어 있습니다. 오류가 관찰된 경우 NuGet에 대한 푸시 문제 해결 및 다른 공급자에 대한 업로드 문제 해결을 참조하세요.

원인 1: vcpkg에 이진 캐시에 대한 쓰기 권한이 없음

출력에 다음 메시지가 없습니다.

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

vcpkg에서 이진 패키지를 이진 캐시에 업로드하지 않았습니다.

  • 이진 캐시 구성로 설정되었는지 확인합니다.writereadwrite

원격 이진 캐시를 사용하는 대신 라이브러리를 다시 빌드합니다.

Important

vcpkg 도구를 최신 릴리스로 업데이트합니다. 또한 포괄적인 오류 로그에 대해 디버그 출력을 사용하도록 설정합니다.

원격 이진 캐시에서 필요한 이진 패키지를 사용할 수 있는 경우에도 시스템에서 라이브러리를 로컬로 다시 빌드합니다.

출력에 다음 메시지가 없습니다.

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

원인 1: vcpkg에 원격 이진 캐시의 읽기 권한이 없음

vcpkg는 원격 캐시를 통해 기본 이진 캐시를 읽도록 선택합니다.

  • 이진 캐시 구성로 설정되었는지 확인합니다.readreadwrite

원인 2: 원격 이진 캐시가 비어 있습니다.

원격 캐시에는 푸시한 이진 패키지 목록이 포함되어야 합니다.

원인 3: 로컬 및 원격 빌드 환경 간의 차이점

이진 캐시의 각 패키지는 컴파일러 버전, 원본 및 이진 패키지를 구분하는 기타 정보를 포함하는 ABI 해시로 레이블이 지정됩니다. 로컬로 계산된 ABI 해시가 원격으로 저장된 해시와 일치하지 않으면 패키지가 검색되지 않습니다.

예기치 않거나 빈번한 라이브러리 다시 작성

Important

vcpkg 도구를 최신 릴리스로 업데이트합니다. 또한 포괄적인 오류 로그에 대해 디버그 출력을 사용하도록 설정합니다.

변경되지 않은 환경에서 vcpkg를 업데이트하지 않고도 라이브러리를 계속 다시 빌드할 수 있습니다.

원인 1: 빌드 환경에서 검색되지 않은 변경 내용

이진 캐시의 각 패키지는 컴파일러 버전, 원본 및 이진 패키지를 구분하는 기타 정보를 포함하는 ABI 해시로 레이블이 지정됩니다. 로컬로 계산된 ABI 해시가 원격으로 저장된 해시와 일치하지 않으면 패키지가 검색되지 않습니다.

ABI 해시 불일치 문제 해결

Important

vcpkg 도구를 최신 릴리스로 업데이트합니다. 또한 포괄적인 오류 로그에 대해 디버그 출력을 사용하도록 설정합니다.

이 가이드는 사용자가 이름이 동일한 두 개의 이진 패키지에 대해 다른 ABI 해시가 있는 이유를 진단하기 위한 것입니다.

두 개의 이진 패키지 비교

동일한 이름의 두 패키지 간의 차이를 확인하려면 원본, 도구 버전, 컴파일러 및 대상 플랫폼과 같은 다양한 데이터를 비교해야 합니다. ABI 해시이 데이터의 간결한 표현을 제공합니다. ABI 해시를 계산할 때 vcpkg는 파일 콘텐츠, 도구 버전 및 시스템 세부 정보를 포함하여 모든 관련 데이터를 고려합니다. 각 데이터 요소에 대한 해시를 만든 다음 이진 패키지에 대한 단일 값으로 이러한 해시를 결합합니다.

이진 패키지 ABI 해시 비교

라이브러리 zlib의 ABI 해시는 다음과 같습니다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

동일한 라이브러리에 대한 실행 간에 해시가 변경되면 두 패키지가 고유하다는 것을 나타냅니다.

컴파일러 버전 ABI 해시 비교

실행 간에 컴파일러 버전이 변경되었는지 확인합니다.

[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

컴파일러 해시는 .입니다 f5d02a6542664cfbd4a38db478133cbb1a18f315.

ABI 해시 항목 비교

각 패키지에 대한 ABI 항목을 비교합니다. 항목은 최종 해시에 기여하는 정보의 일부를 나타냅니다.

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

참고 항목

항목에는 triplet_abi 세 개의 해시, 즉 triplet의 x86-windows 파일 콘텐츠 해시, windows.cmake 도구 체인 및 컴파일러 해시가 포함됩니다. 다른 플랫폼을 대상으로 지정하기로 결정하면 이러한 해시가 변경됩니다.

불일치 1: 포트 파일

포트 파일에는 포트 스크립트(portfile.cmake, vcpkg.json패치 파일)*.patch 또는 포트 디렉터리의 다른 파일이 포함됩니다 ports/<library>/*.

원인 1: 포트 레지스트리를 업데이트한 CI 또는 파이프라인

vcpkg가 CI에서 실행되기 전에 최신 vcpkg 리포지토리를 복제했습니다.

  • 스크립트를 사용하는 git clone https://github.com/microsoft/vcpkgbootstrap 경우 특정 커밋을 체크 아웃해야 합니다.
  • vcpkg를 프로젝트에 git 하위 코드로 추가하는 것이 좋습니다.

원인 2: GitHub Actions 업데이트 vcpkg

업데이트된 GitHub Actions에서 제공하는 vcpkg의 시스템 복사본을 사용하고 있습니다.

  • vcpkg의 고유한 복사본을 복제합니다.
  • 프로젝트에서 vcpkg를 git 하위 코드로 만드는 것이 좋습니다.

불일치 2: vcpkg CMake 도우미 함수

CMake 도우미 함수는 스크립트 디렉터리에 scripts/*상주하며 일반적으로 .로 vcpkg_시작합니다.

원인 1: CI 또는 파이프라인 업데이트된 도우미 스크립트

vcpkg가 CI에서 실행되기 전에 최신 vcpkg 리포지토리를 복제했습니다.

  • 스크립트를 사용하는 git clone https://github.com/microsoft/vcpkgbootstrap 경우 특정 커밋을 체크 아웃해야 합니다.
  • vcpkg를 프로젝트에 git 하위 코드로 추가하는 것이 좋습니다.

원인 2: GitHub Actions 업데이트 vcpkg

업데이트된 GitHub Actions에서 제공하는 vcpkg의 시스템 복사본을 사용하고 있습니다.

  • vcpkg의 고유한 복사본을 복제합니다.
  • 프로젝트에서 vcpkg를 git 하위 코드로 만드는 것이 좋습니다.

불일치 3: 컴파일러 버전

vcpkg는 다른 버전의 컴파일러를 사용하여 종속성을 다시 작성했습니다.

원인 1: Visual Studio C++ 컴파일러가 자동으로 업데이트됩니다.

Visual Studio는 실행 사이에 컴파일러를 포함하여 C++ 워크로드를 자동으로 업데이트했습니다. 부 버전 업데이트도 vcpkg에서 라이브러리 집합을 다시 빌드합니다.

원인 2: 라이브러리는 라이브러리를 사용하는 데 사용되는 컴퓨터와 다른 컴퓨터에 빌드되었습니다.

한 컴퓨터가 이진 패키지를 만들어 원격 캐시에 게시했습니다. 일반적으로 개발에 사용되는 다른 컴퓨터는 캐시된 라이브러리를 사용했습니다.

  • 원격 컴퓨터와 동일한 C++ 컴파일러 버전을 로컬로 사용합니다. Visual Studio의 경우 고정 버전 부트스트래퍼고려합니다.
  • 개발 목적으로 로컬로 종속성을 다시 빌드합니다. 연속 통합 중에 나중에 문제를 테스트하고 해결합니다.

원인 3: 자체 호스팅 이미지가 컴파일러를 업데이트했습니다.

vcpkg 종속성을 빌드하는 데 사용한 기본 이미지가 변경되어 컴파일러 버전이 업데이트되었습니다.

  • 안정적이고 버전이 지정된 이미지에 고정합니다. 실행 간에 기본 도구 또는 컴파일러를 자동으로 업데이트하지 않도록 최신 이미지를 가져오지 않는지 확인합니다.
  • 이미지를 자주 업데이트해야 하는 경우 이미지를 만들 때 C++ 컴파일러 도구를 특정 버전에 고정합니다.

원인 4: GitHub Hosted Runners가 기본 컴파일러를 업데이트했습니다.

호스트된 GitHub 실행기는 컴파일러 및 도구를 매주 업데이트합니다.

  • 현재 이미지를 수정하고 도구 및 컴파일러 버전이 주기적으로 업데이트되지 않도록 방지할 수 있는 방법은 없습니다. 대체 솔루션은 다른 옵션 섹션을 참조하세요.

불일치 4: 실행 간에 변경된 도구의 버전입니다.

라이브러리 CMake 또는 PowerShell을 빌드하는 데 사용되는 도구 버전이 실행 간에 변경되었습니다.

원인 1: Visual Studio가 자동으로 업데이트됩니다.

Visual Studio는 실행 사이에 모든 도구를 포함하여 자동으로 업데이트됩니다. 부 버전 업데이트도 vcpkg에서 라이브러리 집합을 다시 빌드합니다.

  • 자동 Visual Studio 업데이트를 사용하지 않도록 설정합니다.
  • vcpkg 호출에 추가 --x-abi-tools-use-exact-versions 합니다. 이렇게 하면 버전 vcpkgTools.xml에 따라 도구의 ABI가 수정됩니다. vcpkg는 필요한 경우 자체 복사본을 가져옵니다.

원인 2: 라이브러리는 라이브러리를 사용하는 데 사용되는 컴퓨터와 다른 컴퓨터에 빌드되었습니다.

한 컴퓨터가 이진 패키지를 만들어 원격 캐시에 게시했습니다. 일반적으로 개발에 사용되는 다른 컴퓨터는 캐시된 라이브러리를 사용했습니다.

  • 원격 컴퓨터에서와 동일한 도구 버전을 로컬로 사용합니다.
  • 개발 목적으로 로컬로 종속성을 다시 빌드합니다. 연속 통합 중에 나중에 문제를 테스트하고 해결합니다.
  • vcpkg 호출에 추가 --x-abi-tools-use-exact-versions 합니다. 이렇게 하면 버전 vcpkgTools.xml에 따라 도구의 ABI가 수정됩니다. vcpkg는 필요한 경우 자체 복사본을 가져옵니다.

원인 3: 자체 호스팅 이미지가 도구를 업데이트했습니다.

vcpkg 종속성을 빌드하는 데 사용한 기본 이미지가 변경되어 사용된 모든 도구의 버전이 변경되었습니다.

  • 안정적이고 버전이 지정된 이미지에 고정합니다. 실행 간에 기본 도구를 자동으로 업데이트하지 않도록 최신 이미지를 가져오지 않는지 확인합니다.
  • 이미지를 자주 업데이트해야 하는 경우 이미지를 만들 때 관련 도구를 특정 버전에 고정합니다.
  • vcpkg 호출에 추가 --x-abi-tools-use-exact-versions 합니다. 이렇게 하면 버전 vcpkgTools.xml에 따라 도구의 ABI가 수정됩니다. vcpkg는 필요한 경우 자체 복사본을 가져옵니다.

원인 4: GitHub Hosted Runners가 기본 도구를 업데이트했습니다.

호스트된 GitHub 실행기는 컴파일러 및 도구를 매주 업데이트합니다.

  • vcpkg 호출에 추가 --x-abi-tools-use-exact-versions 합니다. 이렇게 하면 버전 vcpkgTools.xml에 따라 도구의 ABI가 수정됩니다. vcpkg는 필요한 경우 자체 복사본을 가져옵니다.

기타 옵션

위의 옵션이 작동하지 않는 경우 다음 해결 방법을 고려하세요.

  • 매니페스트에서 복원하는 대신 종속성의 독립 실행형 보관 파일을 생성하는 데 사용합니다 vcpkg export .
  • Docker 자체 호스팅 이미지를 사용하여 라이브러리를 빌드하는 것이 좋습니다.
  • vcpkg 라이브러리를 정기적으로 빌드하는 보조 연속 통합 실행(예: 매일 또는 매주)

문제는 여기에 나열되지 않습니다.

여기에 문제가 나열되지 않으면 리포지토리를 방문하여 새 문제를 만듭니다.