자습서: 특정 버전의 패키지 설치
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.1
이 fmt
두 제약 조건을 모두 충족합니다. 기준 버전을 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가 버전 확인을 처리하는 방법에 대해 자세히 알아보세요.
다음에 시도할 몇 가지 추가 작업은 다음과 같습니다.
- 이진 캐싱을 사용하여 연속 통합 실행에서 이진 파일 다시 사용
- 사용자 지정 레지스트리를 사용하여 프라이빗 라이브러리 관리
vcpkg