Поделиться через


Начало работы с управление версиями

Использование версий с манифестами

Начнем с создания простого проекта CMake, который зависит от fmt и zlib.

Создайте папку со следующими файлами:

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

Вместо использования портов в ports/vcpkg проверка файлы для каждой версииbuildtrees/versioning/versions/. Файлы в ports/ них по-прежнему используются при запуске vcpkg в классическом режиме.

Примечание.

Выходные данные vcpkg при настройке CMake доступны только при использовании версии 3.18 CMake или более новой версии. Если вы используете старый CMake, вы можете проверка vcpkg-manifest-install.log файл в каталоге сборки.

Ознакомьтесь с записью блога о объявлениях манифестов, чтобы узнать, как использовать манифесты с MSBuild.

Изменения манифеста

Если вы использовали манифесты, прежде чем заметить, что есть некоторые новые свойства JSON. Давайте рассмотрим следующие изменения:

version

{
    "name": "versions-test",
    "version": "1.0.0"
}

Это объявление версии проекта. Ранее можно объявить только версии для проектов с помощью version-string свойства. Теперь, когда управление версиями произошло, vcpkg знает о некоторых новых схемах управления версиями.

Схема версий Description
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" . В нашем примере мы устанавливаем явное ограничение на версию 7.1.3#1fmt.

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/ . Чтобы получить текущую фиксацию vcpkg, можно запустить git rev-parse HEAD и задать ее как встроенную базовую. Дополнительные сведения см. в "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.117порта.

Так как базовый план вводит минимальное ограничение версии для zlib1.2.11#9 и более поздней версии удовлетворяет минимальному ограничению версии для 1.2.11#7vcpkg, разрешено обновить его.

Базовые показатели также являются удобным механизмом обновления нескольких версий за раз, например, если вы хотите зависеть от нескольких boost библиотек, удобнее задать baseline один раз, чем объявить ограничение версии для каждого пакета.

Но что делать, если вы хотите закрепить версию старше базовой версии?

overrides

Так как базовые показатели устанавливают пол версии для всех пакетов и явных ограничений обновляются, когда они ниже базовой, нам нужен еще один механизм для понижения версий после базового плана.

Механизм vcpkg предоставляет этот сценарий overrides. При объявлении переопределения в пакете vcpkg игнорирует все другие ограничения версии либо непосредственно объявлены в манифесте, либо из транзитивных зависимостей. Короче говоря, overrides принудим vcpkg использовать точную версию, объявленную, период.

Давайте еще раз изменим наш пример, чтобы принудительно использовать версию 6.0.0fmtvcpkg.

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

Если вы хотите настроить гибкий порт вместе с управление версиями, следует рассмотреть возможность создания собственного пользовательского реестра.

Дополнительные материалы

Если вы заинтересованы в более глубоком анализе того, как работает управление версиями, мы рекомендуем ознакомиться со ссылками на управление версиями и концепциями управления версиями.