Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Использование версий с манифестами
Начнем с создания простого проекта 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:
Создайте каталог сборки для проекта.
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
Вместо использования портов в ports/vcpkg извлекает файлы для каждой версии в buildtrees/versioning/versions/. Файлы в ports/ по-прежнему используются при запуске vcpkg в классическом режиме.
Заметка
Выходные данные из vcpkg при настройке CMake доступны только при использовании версии 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". В нашем примере мы устанавливаем явное ограничение на 7.1.3#1 версии fmt.
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.11, версию порта 7.
Так как базовый план вводит минимальное ограничение версии для zlib в 1.2.11#9, а более высокая версия удовлетворяет минимальному ограничению версии для 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
Обратите внимание, что fmt теперь находится в версии 6.0.0 так же, как мы хотели.
Версии и пользовательские порты
Последнее, что нужно обсудить, как порты наложения взаимодействуют с разрешением управления версиями. Ответ заключается в том, что они не делают.
Если вы предоставляете наложение для порта, vcpkg всегда будет использовать порт наложения, не заботясь о том, какая версия содержится в нем. Причины двухкратны: (1) он соответствует существующему поведению портов наложения полностью маскирования существующего порта, и (2) порты наложения не (и не ожидается), чтобы предоставить достаточно сведений о функции управления версиями vcpkg.
Если вы хотите настроить гибкий порт вместе с управление версиями, следует сделать собственный пользовательский реестр.
Дальнейшее чтение
Если вы заинтересованы в более подробном анализе того, как работает управление версиями, мы рекомендуем ознакомиться со ссылкой на управление версиями и концепции управления версиями.