버전 관리 시작
매니페스트와 함께 버전 사용
먼저 fmt
및 zlib
따라 달라지는 간단한 CMake 프로젝트를 만들어 보겠습니다.
다음 파일을 사용하여 폴더를 만듭니다.
vcpkg.json
{
"name": "versions-test",
"version": "1.0.0",
"dependencies": [
{
"name": "fmt",
"version>=": "7.1.3#1"
},
"zlib"
],
"builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc"
}
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;
}
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)
이제 CMake를 사용하여 프로젝트를 빌드하고 실행합니다.
프로젝트에 대한 빌드 디렉터리를 만듭니다.
PS D:\versions-test> mkdir build PS D:\versions-test> cd build
CMake를 구성합니다.
PS D:\versions-test\build> cmake -G Ninja -DCMAKE_TOOLCHAIN_FILE=D:/vcpkg/scripts/buildsystems/vcpkg.cmake .. -- Running vcpkg install Detecting compiler hash for triplet x86-windows... The following packages will be built and installed: fmt[core]:x64-windows -> 7.1.3#1 -- D:\Work\viromer\vcpkg\buildtrees\versioning\versions\fmt\4f8427eb0bd40da1856d4e67bde39a4fda689d72 vcpkg-cmake[core]:x64-windows -> 2021-02-26 -- D:\Work\viromer\vcpkg\buildtrees\versioning\versions\vcpkg-cmake\51896aa8073adb5c8450daa423d03eedf0dfc61f vcpkg-cmake-config[core]:x64-windows -> 2021-02-26 -- D:\Work\viromer\vcpkg\buildtrees\versioning\versions\vcpkg-cmake-config\d255b3d566a8861dcc99a958240463e678528066 zlib[core]:x64-windows -> 1.2.11#9 -- D:\Work\viromer\vcpkg\buildtrees\versioning\versions\zlib\827111046e37c98153d9d82bb6fa4183b6d728e4 ...
프로젝트를 빌드합니다.
PS D:\versions-test\build> cmake --build . [2/2] Linking CXX executable main.exe
실행하세요!
PS D:\versions-test\build> ./main.exe fmt version is 70103 zlib version is 1.2.11
출력을 살펴보세요.
fmt[core]:x86-windows -> 7.1.3#1 -- D:\vcpkg\buildtrees\versioning\versions\fmt\4f8427eb0bd40da1856d4e67bde39a4fda689d72
...
zlib[core]:x86-windows -> 1.2.11#9 -- D:\vcpkg\buildtrees\versioning\versions\zlib\827111046e37c98153d9d82bb6fa4183b6d728e4
vcpkg는 ports/
포트파일을 사용하는 대신 buildtrees/versioning/versions/
각 버전에 대한 파일을 체크 아웃합니다.
ports/
파일은 클래식 모드에서 vcpkg를 실행할 때에도 계속 사용됩니다.
메모
CMake를 구성하는 동안 vcpkg의 출력은 CMake 버전 3.18
이상 사용하는 경우에만 사용할 수 있습니다. 이전 CMake를 사용하는 경우 대신 빌드 디렉터리에서 vcpkg-manifest-install.log
파일을 확인할 수 있습니다.
MSBuild에서 매니페스트를 사용하는 방법을 알아보려면 매니페스트 공지 블로그 게시물 읽어보세요.
매니페스트 변경 내용
매니페스트를 사용한 경우 몇 가지 새로운 JSON 속성이 있음을 알 수 있습니다. 다음 변경 내용을 검토해 보겠습니다.
version
{
"name": "versions-test",
"version": "1.0.0"
}
프로젝트의 버전 선언입니다. 이전에는 version-string
속성을 사용하여 프로젝트에 대한 버전만 선언할 수 있습니다. 이제 버전 관리가 시작되었으므로 vcpkg는 몇 가지 새로운 버전 관리 체계를 알고 있습니다.
버전 구성표 | 묘사 |
---|---|
version |
점으로 구분된 숫자: 1.0.0.5 . |
version-semver |
규격 의미 체계 버전: 1.2.0 및 1.2.0-rc . |
version-date |
YYYY-MM-DD 형식의 날짜: 2021-01-01 |
version-string |
임의의 문자열: vista , candy . |
version>=
{
"dependencies": [
{ "name": "fmt", "version>=": "7.1.3" },
"zlib"
]
}
이 속성은 최소 버전 제약 조건을 표현하는 데 사용되며 "dependencies"
선언의 일부로만 허용됩니다. 이 예제에서는 fmt
버전 7.1.3#1
명시적 제약 조건을 설정합니다.
전이적 종속성에 최신 버전이 필요한 경우 vcpkg에서 이 제약 조건을 업그레이드할 수 있습니다. 예를 들어 zlib
fmt
버전 7.1.4
종속성을 선언하는 경우 vcpkg는 대신 7.1.4
설치합니다.
vcpkg는 최소 버전 접근 방식을 사용합니다. 이 예제에서는 fmt
버전 8.0.0
릴리스되더라도 vcpkg는 제약 조건을 충족하는 최소 버전이므로 버전 7.1.3#1
설치합니다. 이 방법의 장점은 vcpkg를 업데이트할 때 예기치 않은 종속성 업그레이드를 받지 않고 동일한 매니페스트를 사용하는 한 재현 가능한 빌드(사용된 버전 측면에서)를 얻을 수 있다는 것입니다.
종속성을 업그레이드하려는 경우 최소 버전 제약 조건을 적용하거나 최신 기준을 사용할 수 있습니다.
builtin-baseline
{ "builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc" }
이 필드는 모든 포트에 대한 버전 관리 기준을 선언합니다. 버전 관리가 가능하도록 설정하려면 기준을 설정해야 합니다. 그렇지 않으면 ports/
디렉터리에서 현재 버전을 가져옵니다. 'git rev-parse HEAD'를 실행하여 vcpkg의 현재 커밋을 가져오고 기본 제공 기준선으로 설정할 수 있습니다. 자세한 내용은 "builtin-baseline"
설명서 참조하세요.
이 예제에서는 zlib
;에 대한 버전 제약 조건을 선언하지 않습니다. 대신, 버전은 기준선에서 가져옵니다. 내부적으로 vcpkg는 커밋 3426db05b996481ca31e95fff3734cf23e0f51bc
확인하여 해당 시점에서 최신 zlib
버전을 확인합니다(이 경우 1.2.11#9
).
버전 확인 중에 기준 버전은 최소 버전 제약 조건으로 처리됩니다. 기준 버전보다 낮은 명시적 제약 조건을 선언하면 명시적 제약 조건이 기준 버전으로 업그레이드됩니다.
예를 들어 다음과 같이 종속성을 수정한 경우
{ "dependencies": [
{
"name": "fmt",
"version>=": "7.1.3#1"
},
{
"name": "zlib",
"version>=": "1.2.11#7"
}
] }
메모
1.2.11#7
값은 버전 1.2.11
포트 버전 7
나타냅니다.
기준은 1.2.11#9
zlib
대한 최소 버전 제약 조건을 도입하고 더 높은 버전은 1.2.11#7
대한 최소 버전 제약 조건을 충족하므로 vcpkg에서 업그레이드할 수 있습니다.
기준은 한 번에 여러 버전을 업그레이드하는 편리한 메커니즘이기도 합니다. 예를 들어 여러 boost
라이브러리를 사용하려는 경우 각 패키지에 버전 제약 조건을 선언하는 것보다 baseline
한 번 설정하는 것이 더 편리합니다.
하지만 기준보다 오래된 버전을 고정하려면 어떻게 해야 할까요?
overrides
기준은 모든 패키지에 대한 버전 층을 설정하고 명시적 제약 조건은 기준선보다 낮을 때 업그레이드되므로 기준을 지나 버전을 다운그레이드하는 또 다른 메커니즘이 필요합니다.
해당 시나리오에 대해 vcpkg가 제공하는 메커니즘은 overrides
. 패키지에서 재정의가 선언되면 vcpkg는 매니페스트에 직접 선언되거나 전이적 종속성에서 선언된 다른 모든 버전 제약 조건을 무시합니다. 요컨대, overrides
vcpkg가 선언된 정확한 버전인 마침표(period)를 사용하도록 강제합니다.
이번에는 vcpkg가 fmt
버전 6.0.0
사용하도록 강제하여 예제를 다시 한 번 수정해 보겠습니다.
{
"name": "versions-test",
"version": "1.0.0",
"dependencies": [
{
"name": "fmt",
"version>=": "7.1.3#1"
},
{
"name": "zlib",
"version>=": "1.2.11#7"
}
],
"builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc",
"overrides": [
{
"name": "fmt",
"version": "6.0.0"
}
]
}
프로젝트를 다시 빌드합니다.
PS D:\versions-test\build> rm ./CMakeCache.txt
PS D:\versions-test\build> rm -r ./vcpkg_installed
PS D:\versions-test\build> cmake -G Ninja -DCMAKE_TOOLCHAIN_FILE=D:/vcpkg/scripts/buildsystems/vcpkg.cmake ..
-- Running vcpkg install
Detecting compiler hash for triplet x86-windows...
The following packages will be built and installed:
fmt[core]:x86-windows -> 6.0.0 -- D:\vcpkg\buildtrees\versioning\versions\fmt\d99b6a35e1406ba6b6e09d719bebd086f83ed5f3
zlib[core]:x86-windows -> 1.2.11#9 -- D:\vcpkg\buildtrees\versioning\versions\zlib\827111046e37c98153d9d82bb6fa4183b6d728e4
...
PS D:\versions-test\build> cmake --build .
[2/2] Linking CXX executable main.exe
그리고 그것을 실행!
PS D:\versions-test\build> .\main.exe
fmt version is 60000
zlib version is 1.2.11
fmt
지금 우리가 원하는 것처럼 버전 6.0.0
방법을 확인합니다.
버전 및 사용자 지정 포트
마지막으로 논의해야 할 것은 오버레이 포트가 버전 관리 확인과 상호 작용하는 방법입니다. 대답은 : 그들은하지 않습니다.
더 자세히 살펴보면 포트에 오버레이를 제공할 때 vcpkg는 포함된 버전을 고려하지 않고 항상 오버레이 포트를 사용합니다. 그 이유는 두 배입니다. (1) 기존 포트를 완전히 마스킹하는 오버레이 포트의 기존 동작과 일치하며( (2) 오버레이 포트는 vcpkg의 버전 관리 기능에 충분한 정보를 제공하지 않습니다(그리고 예상되지 않음).
버전 관리와 함께 유연한 포트 사용자 지정을 사용하려면 고유한 사용자 지정 레지스트리를 만드는고려해야 합니다.
추가 읽기
버전 관리 작동 방식에 대한 세부 정보를 자세히 알아보려면 버전 관리 참조버전 관리 개념읽어보는 것이 좋습니다.