Справочник по управление версиями
Управление версиями позволяет детерминированно контролировать точные редакции зависимостей, используемых проектом из файла манифеста. Управление версиями доступно только пользователям в режиме манифеста.
Дополнительные сведения о алгоритме управления версиями 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-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
Ограничения версий
Базовые показатели
Базовые показатели определяют глобальный этаж версий для того, какие версии будут рассматриваться. Это позволяет манифестам верхнего уровня поддерживать весь график зависимостей в актуальном состоянии без необходимости индивидуально указывать прямые "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" }
]
}