Поделиться через


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

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

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

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

Схемы версий

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

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

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

Свойство Manifest Схема управления версиями
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-DDформата ISO-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.0 порта 2. Если версия порта 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

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

Базовых линий

Базовые показатели определяют глобальный этаж версий для того, какие версии будут рассматриваться (если не указано в другом месте, будет использоваться версия, связанная с этим базовым планом). Это позволяет манифестам верхнего уровня сохранять весь график зависимостей up-to-date без необходимости отдельно указывать прямые ограничения "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.11 версии порта 9.

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" }
  ]
}