다음을 통해 공유


버전 관리 문제 해결 가이드

이 가이드는 버전 관리와 관련된 문제가 발생하는 사용자를 위한 것입니다.

포트에 대한 버전 파일 검사

참고 항목

아래에 설명된 프로세스는 vcpkg 레지스트리의 포트에서 작동하기 위한 것입니다. 버전 관리 데이터베이스가 사용자 지정 레지스트리에서 구현되는 방법을 알아보려면 레지스트리 설명서를 참조하세요.

특정 포트의 버전 데이터베이스를 검사하려면 다음을 수행합니다.

  1. vcpkg/versions 디렉터리로 이동합니다.
  2. 포트의 폴더를 찾습니다.
    • 포트의 첫 문자에 해당하는 폴더를 찾습니다. 예를 들어 . fmt 라는 f-폴더를 엽니다.
  3. 포트 버전 파일을 엽니다.
    • 포트 이름이 같은 JSON 파일을 찾습니다. 예를 들어 버전 파일의 fmt 이름은 입니다. fmt.json.

포트의 버전 파일에는 버전 태그 및 해당 Git 트리 개체 해시와 같은 세부 정보가 포함된 사용 가능한 버전 목록이 포함되어 있습니다. 이 정보는 vcpkg에서 특정 포트 버전을 검색하는 데 필요합니다. 이 목록에 포함된 버전만 매니페스트 파일에서 사용할 수 있습니다.

버전 관리에 대한 자세한 내용은 참조 설명서를 참조하세요.

매니페스트 사용에 대한 자세한 내용은 매니페스트를 참조하세요 .

원인: 존재하지 않는 패키지 버전 요청

매니페스트 파일에 지정된 버전이 vcpkg 버전 데이터베이스에 없는 경우 vcpkg는 종속성을 해결하지 못하고 다음과 유사한 오류 메시지를 생성합니다.

error: no version database entry for fmt at 100.0.0
Available versions:
  10.1.1
  10.1.0
  10.0.0
  9.1.0#1
  9.1.0
  9.0.0
  8.1.1#2
  8.1.1#1
  ...
See `vcpkg help versioning` or https://learn.microsoft.com/vcpkg/users/versioning for more information.

문제를 해결하려면:

  1. 버전 데이터베이스를 업데이트합니다.
    • 원하는 버전이 버전 데이터베이스의 로컬 복사본에 없을 수 있습니다. 이 경우 명령을 실행 git pull 하여 vcpkg 레지스트리최신 커밋으로 업데이트합니다.
  2. 사용 가능한 버전을 확인합니다.
    • 버전 데이터베이스에서 사용할 수 있는 버전 중 하나를 선택합니다.
  3. 매니페스트 파일 업데이트:
    • 파일을 편집합니다 vcpkg.json .
    • 지정된 버전을 vcpkg 리포지토리에서 사용할 수 있는 버전으로 변경합니다. 예를 들어 "version>=": "100.0.0"에서 "version>=": "10.1.1"로 변경합니다.
  4. vcpkg 설치를 실행합니다.
    • vcpkg install 터미널 또는 명령 프롬프트에서 명령을 다시 실행합니다.

원인: 여러 스키마에서 버전 제약 조건 지정

종속성에 대해 파일에 지정된 버전이 vcpkg.json vcpkg 리포지토리의 기준 버전에 사용된 버전과 다른 버전 관리 체계를 사용하는 경우 버전 구성표 충돌이 발생합니다. 이로 인해 vcpkg가 여러 스키마의 버전을 비교할 수 없으므로 오류가 발생합니다.

선언된 version>= 제약 조건이 기준 버전에 사용된 버전과 다른 버전 체계를 사용하는 경우 vcpkg는 다른 버전보다 크거나 같은 버전을 확인할 수 없습니다.

예를 들면 다음과 같이 지정할 수 있습니다.

{
  "dependencies": [
    {
      "name": "boost-regex",
      "version>=": "1.75.0"
    }
  ]
}

vcpkg는 다음 오류 메시지를 출력합니다.

error: version conflict on boost-regex:x64-windows:  required 1.75.0, which cannot be compared with the baseline version 1.83.0.

The versions have incomparable schemes:
  boost-regex@1.83.0 has scheme relaxed
  boost-regex@1.75.0 has scheme string

This can be resolved by adding an explicit override to the preferred version. For example:

  "overrides": [
    { "name": "boost-regex", "version": "1.83.0" }
  ]

See `vcpkg help versioning` or https://learn.microsoft.com/vcpkg/users/versioning for more information.

해결 방법:

  1. 호환되는 버전 구성표를 사용합니다.
    • vcpkg 리포지토리의 버전 데이터베이스를 versions/b-/boost-regex.json 검사하여 기준과 동일한 버전 관리 체계를 사용하는 버전을 boost-regex 찾습니다.
    • 호환되는 version>= 체계를 사용하는 버전으로 제약 조건을 업데이트합니다 vcpkg.json .
  2. 원하는 버전으로 재정의:
    • 다른 버전 관리 체계를 사용하는 특정 버전의 boost-regex가 필요한 경우 매니페스트에서 재정의할 수 있습니다.
    • 원하는 버전을 지정하는 재정의 섹션을 포함하도록 수정합니다 vcpkg.json .
    {
      "dependencies": [
        { "name": "boost-regex" }
      ],
      "overrides": [
        { "name": "boost-regex", "version": "1.75.0" }
      ]
    }
    

원인: 단순 클론에서 부적절한 커밋 기록

vcpkg가 제한된 커밋 기록(단순 클론)으로 복제되는 경우 특정 버전 제약 조건 또는 기준을 해결하는 데 필요한 커밋 기록이 부족합니다. vcpkg에서 특정 버전의 포트를 검색하는 데 사용하는 Git 트리 개체 해시는 전체 커밋 기록이 검사 꺼져 있는 경우에만 사용할 수 있습니다. vcpkg는 단순 리포지토리에 복제된 시기를 감지하고 포트 버전을 검색하지 못할 때 오류 메시지를 생성합니다.

예를 들어 다음과 같은 특정 기준선을 사용하여 vcpkg.json 다음을 수행합니다.

{
  "dependencies": [
    {
      "name": "fmt"
    }
  ],
  "overrides": [
    {
      "name": "fmt",
      "version": "7.1.3#1"
    }
  ],
  "builtin-baseline": "bb588985e37484d543fc849d0d79434e0d45bb3c"
}

다음 오류가 발생합니다.

error: failed to execute: "C:\Program Files\Git\cmd\git.exe" "--git-dir=C:\dev\demo\vcpkg\.git" "--work-tree=C:\dev\demo\vcpkg\buildtrees\versioning_\versions\fmt\4f8427eb0bd40da1856d4e67bde39a4fda689d72_26648.tmp" -c core.autocrlf=false read-tree -m -u 4f8427eb0bd40da1856d4e67bde39a4fda689d72
vcpkg was cloned as a shallow repository in: C:\dev\demo\vcpkg\.git
Try again with a full vcpkg clone.
error: git failed with exit code: (128).
fatal: failed to unpack tree object 4f8427eb0bd40da1856d4e67bde39a4fda689d72
note: while checking out port fmt with git tree 4f8427eb0bd40da1856d4e67bde39a4fda689d72

이 오류는 패키지 fmt 의 특정 버전에 필요한 커밋(4f8427eb0bd40da1856d4e67bde39a4fda689d72)을 단순 클론에서 사용할 수 없음을 나타냅니다.

해결 방법:

  1. 전체 클론으로 변환

    • 이 문제에 대한 가장 쉬운 해결 방법은 전체 복제로 변환하는 것입니다.
    git fetch --unshallow
    
  2. GitHub Actions 사용(기본 단순 복제본)

    • GitHub Actions는 종종 단순 클론으로 기본값을 지정합니다. 이 해결을 위해 GitHub Actions 워크플로를 수정하여 전체 클론을 수행할 수 있습니다. vcpkg를 사용하기 전에 다음 단계를 추가합니다.
    - name: Convert to Full Clone
      run: git fetch --unshallow
    

원인: 전이적 종속성에 기본 기능이 예기치 않게 포함됨

vcpkg를 사용하여 종속성을 관리할 때 프로젝트에 해당 기능을 사용하지 않으려는 경우에도 전이적 종속성이 기본 기능과 함께 설치되는 것을 확인할 수 있습니다. 이 경우 최종 빌드에서 예기치 않은 블로트 또는 기능이 발생할 수 있습니다.

시나리오

라이브러리 Y에 대한 종속성이 있으며, 라이브러리에 X따라 달라집니다. 라이브러리 X 에는 프로젝트에서 제외하려는 기본 기능(예 foo: 포함)이 있습니다. 라이브러리 Y 에 대한 최상위 매니페스트는 다음과 같이 표시될 수 있습니다.

{
  "name": "my-project",
  "dependencies": [
    {
      "name": "Y",
      "features": ["featureB"],
      "default-features": false
    }
  ]
}

설정으로 인해 기본 기능 없이 설치될 것으로 "default-features": false 예상됩니다X. 그러나 X 여전히 기본 기능을 foo사용하여 설치됩니다.

원인

default-features 속성은 최상위 매니페스트에서만 고려됩니다. 즉, 최상위 수준에서 명시적으로 사용하지 않도록 설정하지 않는 한 전이적 종속성의 기본 기능( X 예: 이 시나리오)이 계속 포함됩니다. 라이브러리 Y 가 확인되면 vcpkg 설정을 전이적 종속성X으로 전파 "default-features": false 하지 않으므로 기본 기능을 사용하여 설치 X 됩니다.

해결

기본 기능 없이 전이적 종속성이 X 설치되도록 하려면 최상위 매니페스트의 종속성을 전달하고 기본 기능을 명시적으로 사용하지 않도록 승격해야 합니다. 다음을 사용하여 직접 "default-features": false포함 X 하도록 수정합니다vcpkg.json.

{
  "name": "my-project",
  "dependencies": [
    {
      "name": "Y",
      "features": ["featureB"]
    },
    {
      "name": "X",
      "default-features": false
    }
  ]
}

이 방법은 기본 기능을 제외하는 X 명시적 명령이 있는 직접 종속성이므로 X 기본 기능 없이 설치되도록 합니다.

기본 기능의 작동 방식 및 이를 관리하는 방법에 대한 자세한 내용은 기본 기능 개념 문서 문서를 참조하세요.

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

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