Справочник по управление версиями

Управление версиями позволяет детерминированно контролировать точные редакции зависимостей, используемых проектом из файла манифеста. Управление версиями доступно только пользователям в режиме манифеста.

Дополнительные сведения о алгоритме управления версиями vcpkg и концепциях высокого уровня см . в разделе "Основные понятия управления версиями".

Пример с контекстом см. в руководстве по началу работы с версиями.

Схемы версий

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

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

Схемы управления версиями, понятные vcpkg:

Свойство манифеста Схема управления версиями
version Для числовых версий, разделенных точками
version-semver Для версий, совместимых с SemVer
version-date Даты в формате YYYY-MM-DD
version-string Для произвольных строк

Манифест должен содержать только одно объявление версии.

Примечание.

По дизайну vcpkg не сравнивает версии, использующие разные схемы. Например, пакет, имеющий version-string: 7.1.3 не удается сравнить с тем же пакетом, даже version: 7.1.4если преобразование кажется очевидным.

version

Принимает строки версии, которые соответствуют расслабленной схеме, разделенной точками, semver-like.

Версия логически состоит из числовых разделов, разделенных точками (.). Каждый раздел должен содержать целочисленное положительное число без начальных нулей.

Шаблон регулярных выражений для этой схемы управления версиями: (0|[1-9]\d*)(\.(0|[1-9]\d*))*

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

Пример:

0 < 0.1 < 0.1.0 < 1 < 1.0.0 < 1.0.1 < 1.1< 2.0.0

version-semver

Принимает строки версии, которые соответствуют соглашениям о семантической версии, как описано в спецификации семантического управления версиями.

Поведение сортировки: строки сортируются по правилам, описанным в спецификации семантического управления версиями.

Пример:

1.0.0-1 < 1.0.0-alpha < 1.0.0-beta < 1.0.0 < 1.0.1 < 1.1.0

version-date

Принимает строки версии, которые можно проанализировать до даты после формата YYYY-MM-DDISO-8601. Идентификаторы дизамбигуации допускаются в виде точек с разделителями, положительными, целыми числами без начальных нулей.

Это рекомендуемая схема управления версиями для библиотек Live at HEAD, не имеющих установленных версий выпуска.

Шаблон регулярных выражений для этой схемы управления версиями: \d{4}-\d{2}-\d{2}(\.(0|[1-9]\d*))*

Поведение сортировки: строки сначала сортируются по их части даты, а затем по числовым сравнениям идентификаторов диамбигуации. Идентификаторы дизамбигуации соответствуют правилам расслабленной (version) схемы.

Примеры: 2021-01-01<2021-01-01.1<2021-02-01.1.2<2021-02-01.1.3<2021-02-01

version-string

Для пакетов, использующих строки версии, которые не соответствуют ни одной из других схем, она принимает большинство произвольных строк. Значение # , которое используется для обозначения версий портов, запрещено.

Поведение сортировки: сортировка не выполняется в самой строке версии. Однако если строки совпадают точно, их версии портов можно сравнить и отсортировать.

Примеры:

  • apple <> orange <> orange.2 <> orange2
  • watermelon#0< watermelon#1

port-version

Порт-версии отслеживают изменения в файлах упаковки (vcpkg.jsonи portfile.cmakeт. д.) без каких-либо изменений в версии библиотеки вышестоящий.

Версия порта — это неотрицательное целое число.

Правила для версий портов:

  • Начните с 0 для исходной версии порта,
  • увеличивается на 1 раз при каждом изменении vcpkg в порт, который не увеличивает версию пакета,
  • и сбрасывается до 0 при каждом обновлении версии пакета.

Примечание.

vcpkg следует текстовому формату <version>#<port version>. Например 1.2.0#2 , означает версию порта версии 1.2.02. Если версия порта является 0#0 суффиксом, опущен (например, 1.2.0 подразумевает 1.2.0 версию порта версии 0).

Поведение сортировки: если две версии сравниваются одинаково, их версии портов сравниваются по числовой величине, более низкие версии портов имеют приоритет.

Примеры:

  • 1.2.0 < 1.2.0#1 < 1.2.0#2 < 1.2.0#10
  • 2021-01-01#20 < 2021-01-01.1
  • windows#7 < windows#8

Ограничения версий

Базовые показатели

Базовые показатели определяют глобальный этаж версий для того, какие версии будут рассматриваться. Это позволяет манифестам верхнего уровня поддерживать весь график зависимостей в актуальном состоянии без необходимости индивидуально указывать прямые "version>=" ограничения.

Каждый настроенный реестр имеет связанный базовый план. Для манифестов, которые не настраивают реестры, "builtin-baseline" поле определяет базовый план для встроенного реестра. Если манифест не настраивает реестры и не имеет экземпляра "builtin-baseline", установка работает в соответствии с алгоритмом классического режима и игнорирует все сведения о версиях.

Базовые показатели, как и другие параметры реестра, игнорируются из портов, используемых в качестве зависимостей. Если минимальная версия требуется во время разрешения транзитивной версии, порт должен использоваться "version>=".

Пример

{
  "name": "project",
  "version": "1.0.0",
  "dependencies": ["zlib", "fmt"],
  "builtin-baseline":"9fd3bd594f41afb8747e20f6ac9619f26f333cbe"
}

Чтобы добавить начальное "builtin-baseline", используйте vcpkg x-update-baseline --add-initial-baseline. Чтобы обновить базовые показатели в манифесте, используйте vcpkg x-update-baseline.

version>=

Выражает минимальное требование к версии, version>= объявления помещают более низкую границу в версии, которые можно использовать для удовлетворения зависимости.

Примечание.

vcpkg выбирает самую низкую версию, которая соответствует всем ограничениям, поэтому не требуется меньше ограничений.

Пример:

{
  "name": "project",
  "version-semver": "1.0.0",
  "dependencies": [
    { "name": "zlib", "version>=": "1.2.11#9" },
    { "name": "fmt", "version>=": "7.1.3#1" }
  ],
  "builtin-baseline":"3426db05b996481ca31e95fff3734cf23e0f51bc"
}

В рамках объявления ограничения версии можно указать версию порта, добавив суффикс #<port-version>, в предыдущем примере 1.2.11#9 относится к версии порта версии 1.2.119.

overrides

Объявление переопределения заставляет vcpkg игнорировать все другие ограничения версии и использовать версию, указанную в переопределении. Это полезно для закрепления точных версий и разрешения конфликтов версий.

Переопределения объявляются как массив объявлений версий пакета.

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

{
  "name": "project",
  "version-semver": "1.0.0",
  "dependencies": [
    "curl",
    { "name": "zlib", "version>=": "1.2.11#9" },
    "fmt"
  ],
  "builtin-baseline":"3426db05b996481ca31e95fff3734cf23e0f51bc",
  "overrides": [
    { "name": "fmt", "version": "6.0.0" },
    { "name": "openssl", "version": "1.1.1h#3" }
  ]
}