Руководство. Установка определенной версии пакета

Внимание

Эта функция доступна только в режиме манифеста.

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 добавляет минимальное ограничение версии, zlib1.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 обрабатывает разрешение версий.

Ниже приведены некоторые дополнительные задачи, которые необходимо выполнить следующим образом: