다음을 통해 공유


버전 관리 시작

매니페스트와 함께 버전 사용

다음에 의존하는 fmtzlib간단한 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를 사용하여 프로젝트를 빌드하고 실행합니다.

  1. 프로젝트에 대한 빌드 디렉터리를 만듭니다.

    PS D:\versions-test> mkdir build
    PS D:\versions-test> cd build
    
  2. 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
    ...
    
  3. 프로젝트를 빌드합니다.

    PS D:\versions-test\build> cmake --build .
    [2/2] Linking CXX executable main.exe
    
  4. 실행하면 됩니다.

    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.01.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" 일부로만 허용됩니다. 이 예제에서는 버전 7.1.3#1fmt에 대한 명시적 제약 조건을 설정합니다.

전이적 종속성에 최신 버전이 필요한 경우 vcpkg에서 이 제약 조건을 업그레이드할 수 있습니다. 예를 들어 버전 7.1.4 에 대한 fmt 종속성을 선언하는 경우 zlib vcpkg가 대신 설치 7.1.4 됩니다.

vcpkg는 최소 버전 접근 방식을 사용합니다. 이 예제에서는 버전 8.0.0 이 릴리스되더라도 fmt 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에서 선언된 정확한 버전인 마침표가 강제로 사용되도록 합니다.

이번에는 vcpkg에서 버전을 6.0.0fmt사용하도록 하려면 예제를 다시 한 번 수정해 보겠습니다.

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

우리가 원하는 것처럼 버전에 6.0.0 지금 방법을 fmt 알 수 있습니다.

버전 및 사용자 지정 포트

마지막으로 논의해야 할 것은 오버레이 포트가 버전 관리 확인과 상호 작용하는 방법입니다. 대답은 : 그들은하지 않습니다.

더 자세히 살펴보면 포트에 오버레이를 제공할 때 vcpkg는 포함된 버전을 고려하지 않고 항상 오버레이 포트를 사용합니다. 그 이유는 두 배입니다. (1) 기존 포트를 완전히 마스킹하는 오버레이 포트의 기존 동작과 일치하며( (2) 오버레이 포트는 vcpkg의 버전 관리 기능에 충분한 정보를 제공하지 않습니다(그리고 예상되지 않음).

버전 관리와 함께 유연한 포트 사용자 지정을 원하는 경우 고유한 사용자 지정 레지스트리를 만드는 것이 좋습니다.

추가 참고 자료

버전 관리 작동 방식에 대한 세부 정보를 자세히 알아보려면 버전 관리 참조버전 관리 개념을 읽어보는 것이 좋습니다.