다음을 통해 공유


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

Important

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

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 설치 경로로 바꿉 %VCPKG_ROOT% 다.

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"
}

vcpkg 리포지토리의 특정 커밋 SHA로 설정 builtin-baseline 하면 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 명령은 매니페스트 파일을 수정하여 vcpkg 인스턴스의 현재 Git 커밋으로 설정합니다 builtin-baseline .

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

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

기준은 패키지의 버전을 잠그는 유일한 방법은 아닙니다. vcpkg는 .의 version>=형태로 최소 버전 제약 조건도 허용합니다.

다음의 내용을 수정합니다.vcpkg.json

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

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

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

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

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 두 제약 조건을 모두 충족합니다. 기준 버전을 1.2.11가져오는 방법을 zlib 확인합니다.

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" 패키지는 다른 모든 버전 제약 조건을 무시하면서 지정된 버전을 사용합니다. 이 예제에서 기준 3426db05b996481ca31e95fff3734cf23e0f51bc 은 최소 버전 제약 조건을 zlib 추가하지만 재정의 1.2.11 선언은 버전을 1.2.8 강제로 적용합니다.

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

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가 버전 확인을 처리하는 방법에 대해 자세히 알아보세요.

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