Разрешение имен пакета
vcpkg определяет ответственный реестр (или наложение) для каждого пакета перед обращением к сети. Это предотвращает атаки путаницы зависимостей пакета, так как разрешение имен не зависит от внешнего состояния.
Ниже приведены действия по алгоритму разрешения имен.
- Если имя найдено в наложении , используйте это наложение; в противном случае
- Если есть
"packages"
шаблон, соответствующий имени порта, используйте этот реестр; иначе - Если реестр по умолчанию не
null
задан, используйте этот реестр; в противном случае - Не удается разрешить порт в реестр.
При наличии нескольких "packages"
шаблонов, соответствующих имени, vcpkg определяет приоритет следующим образом:
- Точное совпадение --
boost
выбраноboost*
- Самый длинный шаблон --
boost*
выбираетсяb*
- Первое совпадение — первый реестр, объявляющий лучший шаблон, выбран
Пример #1. Разрешение имен пакета
vcpkg-configuration.json
{
"registries": [
{
"kind": "git",
"repository": "https://github.com/microsoft/vcpkg-docs",
"reference": "vcpkg-registry",
"baseline": "768f6a3ad9f9b6c4c2ff390137690cf26e3c3453",
"packages": ["bei*"]
},
{
"kind": "git",
"repository": "https://github.com/vicroms/vcpkg-registry",
"baseline": "dacf4de488094a384ca2c202b923ccc097956e0c",
"packages": ["beicode", "bei*"]
}
]
}
vcpkg.json
{
"dependencies": [
"beicode",
"beison",
"fmt"
],
"builtin-baseline": "7e7c62d863b1bf599c1d104b76cd8b74475844d4"
}
Учитывая эту конфигурацию, каждое имя пакета разрешается следующим образом:
beicode
: из реестраhttps://github.com/vicroms/vcpkg-registry
(точное совпадение)beicode
beison
: из реестраhttps://github.com/Microsoft/vcpkg-docs
(совпадение шаблоновbeison
и объявлен первый в"registries"
массиве)fmt
: из реестра по умолчанию (нет совпадений)
Поскольку несколько реестров объявляют bei*
, vcpkg также выдает предупреждение:
Found the following problems in configuration (path/to/vcpkg-configuration.json):
$ (a configuration object): warning: Package "bei*" is duplicated.
First declared in:
location: $.registries[0].packages[0]
registry: https://github.com/microsoft/vcpkg-docs
The following redeclarations will be ignored:
location: $.registries[1].packages[1]
registry: https://github.com/vicroms/vcpkg-registry
Пример 2. Назначение нескольких шаблонов реестру по умолчанию
Реестр по умолчанию можно изменить двумя способами. Во-первых, определив :"default-registry"
{
"default-registry": {
"kind": "git",
"repository": "https://github.com/Microsoft/vcpkg",
"baseline": "e79c0d2b5d72eb3063cf32a1f7de1a9cf19930f3"
}
}
Во-вторых, задав "default-registry"
null
шаблон в массиве "registries"
и используя "*"
его:
{
"default-registry": null,
"registries": [
{
"kind": "git",
"repository": "https://github.com/Microsoft/vcpkg",
"baseline": "e79c0d2b5d72eb3063cf32a1f7de1a9cf19930f3",
"packages": ["*"]
}
]
}
Преимущество второй формы заключается в том, что вы можете добавить дополнительные записи в массив пакетов, а "default-registry"
объект не позволяет определить массив пакетов вообще. Это различие становится важным в случаях, когда необходимо убедиться, что пакет поставляется из реестра по умолчанию.
Рассмотрим реестр, предоставляющий библиотеки Qt Framework.
vcpkg-configuration.json
{
"default-registry": {
"kind": "git",
"repository": "https://github.com/Microsoft/vcpkg",
"baseline": "7e7c62d863b1bf599c1d104b76cd8b74475844d4"
},
"registries": [
{
"kind": "git",
"repository": "https://github.com/custom-qt/custom-qt-registry",
"baseline": "adfc4de488094a384ca2c202b923ccc097956e0c",
"packages": ["qt*"]
}
]
}
И следующие зависимости проекта:
vcpkg.json
{
"dependencies": [
"qt5",
"qt-advanced-docking-system",
"qtkeychain"
]
}
Шаблон "qt*"
соответствует всем именам портов в vcpkg.json
. Но есть проблема! Порты qt-advanced-docking-system
и qtkeychain
не являются частью официальных библиотек Qt Framework, так как vcpkg не сможет найти порты в пользовательском реестре, установка завершится ошибкой.
Это можно исправить, назначив эти пакеты реестру по умолчанию.
Мы делаем это, изменив способ объявления реестра по умолчанию и добавления qt-advanced-docking-system
и qtkeychain
в его "packages"
массив:
vcpkg-configuration.json
{
"default-registry": null,
"registries": [
{
"kind": "git",
"repository": "https://github.com/Microsoft/vcpkg",
"baseline": "e79c0d2b5d72eb3063cf32a1f7de1a9cf19930f3",
"packages": ["*", "qt-advanced-docking-system", "qtkeychain"]
},
{
"kind": "git",
"repository": "https://github.com/custom-qt/custom-qt-registry",
"baseline": "adfc4de488094a384ca2c202b923ccc097956e0c",
"packages": ["qt*"]
}
]
}
Так как точные совпадения предпочтительнее для совпадений шаблонов и qt-advanced-docking-system
qtkeychain
будут разрешаться в реестр по умолчанию.
Порты наложения
Порты наложения — это способ расширения vcpkg с дополнительными портами без создания полного реестра. Наложения рассматриваются перед любыми подстановками реестра или рекомендациями по настройке версий. Наложения заменяют все встроенные тройники или порты. Дополнительные сведения см. в статье о наложении портов .
Порты наложения оцениваются в этом порядке:
- Наложение из командной строки
--overlay-ports
в указанном порядке; затем - Наложения из
vcpkg-configuration.json
"overlay-ports"
в порядке; затем - Наложения из переменной
VCPKG_OVERLAY_PORTS
среды в порядке.
Наложение тройных
Триплеты наложения — это способ расширения vcpkg с дополнительными триплетами без изменения каталога установки vcpkg. Наложения считаются перед любыми встроенными триплетами.
Триплеты наложения оцениваются в этом порядке:
- Наложение из командной строки в указанном порядке; затем
- Наложения из
vcpkg-configuration.json
исправный; тогда - Наложения из переменной
VCPKG_OVERLAY_TRIPLETS
среды в порядке.