Руководство. Установка определенной версии пакета
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_ROOT%
на путь к установленному vcpkg:
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"
}
Установка builtin-baseline
на определенный коммит SHA репозитория vcpkg указывает 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
изменяет файл манифеста, чтобы установить builtin-baseline
на текущий коммит Git версии vcpkg.
Вы можете использовать параметр --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_ROOT%
на путь вашей установки vcpkg.
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
удовлетворяет обеим ограничениям. Обратите внимание, как zlib
получает базовую версию 1.2.11
.
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_ROOT%
на путь к вашей установке vcpkg.
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 обрабатывает разрешение версий.
Ниже приведены некоторые дополнительные задачи, которые необходимо выполнить следующим образом:
- Повторное использование двоичных файлов в ходе непрерывной интеграции с помощью кэширования двоичных файлов
- Управляйте вашими частными библиотеками при помощи пользовательских реестров