Руководство. Установка определенной версии библиотек Boost с помощью базовых показателей реестра"

vcpkg предоставляет Boost набор библиотек в виде отдельных пакетов в качестве удобства для пользователей, которые зависят только от ограниченного подмножества пакетов Boost. Однако этот подход имеет компромисс. Пользователям, которые хотят заблокировать определенную версию зависимостей Boost, необходимо переопределить версии каждого пакета Boost, от которого они зависят.

Однако существует простое решение этой проблемы с использованием базовых показателей реестра и шаблонов пакетов.

Необходимые компоненты

  • Терминал
  • Компилятора C++
  • vcpkg

задачи;

Предположим, что у вас есть проект, от которого зависит boost-optional и требуется заблокировать версию 1.80.0 библиотек Boost. Поэтому вы создадите переопределение для зависимости, как показано ниже:

vcpkg.json

{
    "dependencies": [ "boost-optional" ],
    "overrides": [
        { "name": "boost-optional", "version": "1.80.0" }
    ]
}

vcpkg-configuration.json

{
  "default-registry": {
    "kind": "git",
    "repository": "https://github.com/Microsoft/vcpkg",
    "baseline": "3265c187c74914aa5569b75355badebfdbab7987"
  }
}

При запуске vcpkg installвы заметите, что только версия boost-optional заблокирована 1.80.0 , а другие зависимости Boost используют базовую версию (1.83.0).

Fetching registry information from https://github.com/Microsoft/vcpkg (HEAD)...
Detecting compiler hash for triplet x64-linux...
The following packages will be built and installed:
  * boost-assert:x64-linux -> 1.83.0
  * boost-config:x64-linux -> 1.83.0
  * boost-core:x64-linux -> 1.83.0
  * boost-detail:x64-linux -> 1.83.0
  * boost-io:x64-linux -> 1.83.0
  * boost-move:x64-linux -> 1.83.0
    boost-optional:x64-linux -> 1.80.0
  * boost-predef:x64-linux -> 1.83.0
  * boost-preprocessor:x64-linux -> 1.83.0
  * boost-static-assert:x64-linux -> 1.83.0
  * boost-throw-exception:x64-linux -> 1.83.0
  * boost-type-traits:x64-linux -> 1.83.0
  * boost-uninstall:x64-linux -> 1.83.0
  * boost-utility:x64-linux -> 1.83.0
  * boost-vcpkg-helpers:x64-linux -> 1.83.0
Additional packages (*) will be modified to complete this operation.

1. Получение базовой версии Boost

Выполните следующую команду, чтобы просмотреть журнал фиксаций, которые изменили базу данных версии для boost-optional пакета:

git log "--format=%H %cd %s" --date=short --left-only -- versions/b-/boost-optional.json

Должен отобразиться примерно такой результат:

caa7579a1c48e2ca770f6ccf98cb03db95642631 2023-09-13 [boost] update to v1.83.0 (#33597)
5d3798ac7388ca66c169773e46103b14077b76a4 2023-06-06 [boost] Remove port version constraints (#31572)
501db0f17ef6df184fcdbfbe0f87cde2313b6ab1 2023-04-15 [boost-build] Fix SHA512 and add MSVC workaround. (#30884)
bedfdb774cfbe47da202169046ca15441a213f3e 2023-04-15 [Boost] Update Boost ports to 1.82#0 (#30856)
9484a57dd560b89f0a583be08af6753611c57fd5 2023-02-24 Update vcpkg-tool to 2023-02-16. (#29664)
6aa38234d08efefc55b70025cf6afc2212e78e15 2023-02-01 [boost] Fix generate ports to match the tree. (#29338)
6d41737729b170cb7d323a4fddd21607c9237636 2022-12-20 [boost] update to 1.81.0 (#28356)
5ba2b95aea2a39aa89444949c7a047af38c401c1 2022-10-18 [boost] Add version constraints (#26817)
8424da584e59e05956913bf96f87654aa3096c7e 2022-08-25 [boost] update to 1.80.0 (#26233)
96ec7fb25da25e0463446e552d59715a47c95e73 2022-04-21 [boost] update to 1.79.0 (#24210)
76d4836f3b1e027758044fdbdde91256b0f0955d 2022-01-10 [boost] update to 1.78.0 (#21928)
cc471dc0f59b7b2066d6172c2893419412327a7a 2021-09-27 [boost] update to 1.77.0 (#19556)
761c81d43335a5d5ccc2ec8ad90bd7e2cbba734e 2021-07-07 [boost] update to 1.76.0 (#17335)
68a74950d0400f5a803026d0860f49853984bf11 2021-01-21 [vcpkg] Rename `port_versions` to `versions` (#15784)

Как видите, фиксация для версии 1.80.0 указана. На следующем шаге вы будете использовать эту фиксацию в качестве базового плана для всех пакетов Boost.

2. Использование базового плана для переопределения пакетов Boost

Вместо добавления переопределения для всех связанных зависимостей Boost можно использовать базовый план реестра для блокировки набора версий. Измените vcpkg-configuration.json файл, как показано ниже:

vcpkg-configuration.json

{
  "default-registry": {
    "kind": "git",
    "repository": "https://github.com/Microsoft/vcpkg",
    "baseline": "3265c187c74914aa5569b75355badebfdbab7987"
  },
  "registries": [
    {
      "kind": "git",
      "repository": "https://github.com/Microsoft/vcpkg",
      "baseline": "8424da584e59e05956913bf96f87654aa3096c7e",
      "packages": [ "boost*", "boost-*"]
    }
  ]
}

Файл конфигурации содержит два определения реестра. Указывает default-registry на проверенный реестр vcpkg при https://github.com/Microsoft/vcpkg использовании последней фиксации во время написания этой статьи. А второй реестр, который также указывает на проверенный реестр vcpkg, но на предыдущем базовом уровне и ограничен пакетами, соответствующими boost* шаблонам.boost-*

Если вы выполните vcpkg install команду, обратите внимание, что на этот раз все библиотеки Boost используют версию 1.80.0.

Fetching registry information from https://github.com/Microsoft/vcpkg (HEAD)...
Detecting compiler hash for triplet x64-linux...
The following packages will be built and installed:
  * boost-assert:x64-linux -> 1.80.0
  * boost-config:x64-linux -> 1.80.0
  * boost-core:x64-linux -> 1.80.0
  * boost-detail:x64-linux -> 1.80.0
  * boost-io:x64-linux -> 1.80.0
  * boost-move:x64-linux -> 1.80.0
    boost-optional:x64-linux -> 1.80.0
  * boost-predef:x64-linux -> 1.80.0
  * boost-preprocessor:x64-linux -> 1.80.0
  * boost-static-assert:x64-linux -> 1.80.0
  * boost-throw-exception:x64-linux -> 1.80.0
  * boost-type-traits:x64-linux -> 1.80.0
  * boost-uninstall:x64-linux -> 1.80.0
  * boost-utility:x64-linux -> 1.80.0
  * boost-vcpkg-helpers:x64-linux -> 1.80.0
  * boost-winapi:x64-linux -> 1.80.0
Additional packages (*) will be modified to complete this operation.

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

Следующие шаги

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