다음을 통해 공유


자습서: 특정 버전의 패키지 설치

중요하다

이 기능은 매니페스트 모드에서만 사용할 수 있습니다.

vcpkg를 사용하면 프로젝트에서 각 종속성의 정확한 버전을 제어할 수 있습니다.

이 자습서에서는 다음을 알아봅니다.

필수 구성 요소

  • 터미널
  • 코드 편집기
  • vcpkg
  • CMake

1 - 매니페스트를 사용하여 프로젝트 만들기

빈 폴더에서 다음 프로젝트 파일을 만듭니다.

원본 파일(main.cpp):

#include <fmt/core.h>
#include <zlib.h>

int main()
{
    fmt::print("fmt version is {}\n"
               "zlib version is {}\n", 
               FMT_VERSION, ZLIB_VERSION);
    return 0;
}

CMake 프로젝트 파일(CMakeLists.txt):

cmake_minimum_required(VERSION 3.18)

project(versionstest CXX)

add_executable(main main.cpp)

find_package(ZLIB REQUIRED)
find_package(fmt CONFIG REQUIRED)
target_link_libraries(main PRIVATE ZLIB::ZLIB fmt::fmt)

vcpkg 매니페스트(vcpkg.json):

{
  "dependencies": [ "fmt", "zlib" ]
}

프로젝트를 빌드하고 %VCPKG_ROOT% vcpkg 설치 경로로 바꿉다.

cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=%VCPKG_ROOT%/scripts/buildsystems/vcpkg.cmake
cmake --build build

프로그램을 실행합니다.

fmt version is 70103
zlib version is 1.2.11

프로그램을 실행할 때 이러한 라이브러리의 버전은 위의 출력과 다를 수 있습니다. 다음 단계에서는 프로젝트를 빌드할 때마다 일관성을 유지하도록 이러한 종속성의 버전을 잠그는 방법을 보여 드립니다.

2 - 기준을 사용하여 버전 제약 조건 추가

버전 기준은 모든 패키지에 대한 최소 버전 층을 설정합니다. vcpkg 개념 읽어 기준에 대해 알아보세요.

이전 단계에서 사용된 정확한 버전을 얻으려면 vcpkg.json 내용을 다음과 같이 수정합니다.

{
  "dependencies": [
    "fmt",
    "zlib"
  ],
  "builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc"
}

builtin-baseline vcpkg 리포지토리의 특정 커밋 SHA로 설정하면 vcpkg에서 특정 커밋의 패키지 버전을 모든 패키지의 최소 버전으로 사용하도록 지시합니다.

Git을 사용하여 해당 특정 기준의 버전을 검사할 수 있습니다.

git show 3426db05b996481ca31e95fff3734cf23e0f51bc:versions/baseline.json | Select-String -Pattern '"zlib"|"fmt"' -Context 0,3

출력은 다음과 유사합니다.

    "fmt": {
      "baseline": "7.1.3",
      "port-version": 1
    },
--
    "zlib": {
      "baseline": "1.2.11",
      "port-version": 9
    },

3 - 기준 버전 업데이트

기준선은 모든 종속성의 버전을 한 번에 업데이트하는 편리한 메커니즘을 제공합니다. 기준을 업데이트하려면 다음 명령을 실행합니다.

vcpkg x-update-baseline

x-update-baseline 명령은 매니페스트 파일을 수정하여 builtin-baseline vcpkg 인스턴스의 현재 Git 커밋으로 설정합니다.

--add-initial-baseline 옵션을 사용하여 아직 builtin-baseline 없는 매니페스트에 추가할 수 있습니다.

4 - 최소 버전 제약 조건 추가

베이스라인은 패키지의 버전을 잠그는 유일한 방법이 아닙니다. vcpkg는 version>=형식의 최소 버전 제약 조건도 허용합니다.

vcpkg.json 내용을 다음과 같이 수정합니다.

{
  "dependencies": [
    {
        "name": "fmt",
        "version>=": "10.1.1"
    },
    "zlib"
  ],
  "builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc"
}

위의 매니페스트 파일은 종속성 개체 표기법을 사용하여 fmt최소 버전 제약 조건(version>=)을 설정합니다. 종속성을 충족하기 위해 vcpkg는 기준에서 제공되는 제약 조건과 dependencies 목록의 최소 버전 제약 조건에서 오는 두 가지 제약 조건을 충족해야 합니다.

  • 기준 제약 조건, "version>=": "7.1.3".
  • 종속성 목록 제약 조건, "version>=": "10.1.1".

프로젝트를 빌드하고 실행한 후, %VCPKG_ROOT%을 vcpkg 설치 경로로 바꾸십시오.

rm -r build
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=%VCPKG_ROOT%/scripts/buildsystems/vcpkg.cmake
cmake --build build
./build/main

출력은 다음과 같습니다.

fmt version is 100100
zlib version is 1.2.11

이 경우 버전 10.1.1fmt 두 제약 조건을 모두 충족합니다. zlib가 기준 버전 1.2.11을 어떻게 가지는지 주목하세요.

5 - 특정 버전 강제 적용

경우에 따라 패키지의 특정 버전을 강제로 적용할 수 있습니다. 예를 들면 다음과 같습니다.

  • 버전 충돌을 해결하려면
  • 기준보다 오래된 버전을 잠그기 위해
  • 비교할 수 없는 버전을 잠그려면(예: vista, xp.

vcpkg를 사용하면 버전 재정의를 사용하여 이러한 문제를 해결할 수 있습니다.

vcpkg.json 내용을 다음과 같이 수정합니다.

{
  "dependencies": [
    {
        "name": "fmt",
        "version>=": "10.1.1"
    },
    "zlib"
  ],
  "builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc", 
  "overrides": [
    { 
        "name": "zlib", 
        "version": "1.2.8"
    }
  ]
}

"overrides" 목록에 포함된 패키지는 다른 모든 버전 제약 조건을 무시하면서 지정된 버전을 사용합니다. 이 예제에서 기준 3426db05b996481ca31e95fff3734cf23e0f51bczlib에 대해 1.2.11의 최소 버전 제약 조건을 부여하지만, 재정의 선언에서는 대신 버전 1.2.8을 강제합니다.

프로젝트를 빌드하고 실행한 후 %VCPKG_ROOT%를 vcpkg 설치 경로로 바꿉니다.

rm -r build
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=%VCPKG_ROOT%/scripts/buildsystems/vcpkg.cmake
cmake --build build
./build/main

출력은 다음과 같습니다.

fmt version is 100100
zlib version is 1.2.8

다음 단계

이 자습서에서는 vcpkg가 특정 패키지 버전을 잠그기 위해 제공하는 다양한 메커니즘을 알아보았습니다. vcpkg가 버전 확인을 처리하는 방법에 대해 자세히 알아보려면 버전 관리 개념참조 읽어보세요.

다음에 시도할 몇 가지 추가 작업은 다음과 같습니다.