Разрешение имен пакета
vcpkg определяет ответственный реестр (или наложение) для каждого пакета перед обращением к сети. Это предотвращает атаки путаницы зависимостей пакета, так как разрешение имен не зависит от внешнего состояния.
Ниже приведены действия по алгоритму разрешения имен.
- Если имя найдено в наложении , используйте это наложение; в противном случае
- Если есть
"packages"
шаблон, соответствующий имени порта, используйте этот реестр; иначе - Если реестр по умолчанию не
null
задан, используйте этот реестр; в противном случае - Не удается разрешить порт в реестр.
При наличии нескольких "packages"
шаблонов, соответствующих имени, vcpkg определяет приоритет следующим образом:
- Точное совпадение --
boost
выбраноboost*
- Самый длинный шаблон --
boost*
выбираетсяb*
- Первое совпадение — первый реестр, объявляющий лучший шаблон, выбран
Пример #1. Разрешение имен пакета
vcpkg-configuration.json
{
"registries": [
{
"kind": "git",
"repository": "https://github.com/northwindtraders/vcpkg-registry",
"baseline": "dacf4de488094a384ca2c202b923ccc097956e0c",
"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/northwindtraders/vcpkg-registry
(совпадение шаблонов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/northwindtraders/vcpkg-registry
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 с дополнительными портами и дополнительными триплетами без создания полного реестра. Наложения рассматриваются перед выполнением любых подстановок реестра или управления версиями и заменят все встроенные триплеты или порты. Дополнительные сведения см. в статье о наложении портов .
Параметры наложения оцениваются в этом порядке:
- Наложение из командной строки в указанном порядке; затем
- Наложения из
vcpkg-configuration.json
исправный; тогда - Наложения из
VCPKG_OVERLAY_[PORTS|TRIPLETS]
переменных среды в порядке.
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по