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


Разрешение имен пакета

vcpkg определяет ответственный реестр (или наложение) для каждого пакета перед обращением к сети. Это предотвращает атаки путаницы зависимостей пакета, так как разрешение имен не зависит от внешнего состояния.

Ниже приведены действия по алгоритму разрешения имен.

При наличии нескольких "packages" шаблонов, соответствующих имени, vcpkg определяет приоритет следующим образом:

  1. Точное совпадение -- boost выбрано boost*
  2. Самый длинный шаблон -- boost* выбирается b*
  3. Первое совпадение — первый реестр, объявляющий лучший шаблон, выбран

Пример #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 с дополнительными портами без создания полного реестра. Наложения рассматриваются перед любыми подстановками реестра или рекомендациями по настройке версий. Наложения заменяют все встроенные тройники или порты. Дополнительные сведения см. в статье о наложении портов .

Порты наложения оцениваются в этом порядке:

  1. Наложение из командной строки --overlay-ports в указанном порядке; затем
  2. Наложения из vcpkg-configuration.json"overlay-ports" в порядке; затем
  3. Наложения из переменной VCPKG_OVERLAY_PORTS среды в порядке.

Наложение тройных

Триплеты наложения — это способ расширения vcpkg с дополнительными триплетами без изменения каталога установки vcpkg. Наложения считаются перед любыми встроенными триплетами.

Триплеты наложения оцениваются в этом порядке:

  1. Наложение из командной строки в указанном порядке; затем
  2. Наложения из vcpkg-configuration.json исправный; тогда
  3. Наложения из переменной VCPKG_OVERLAY_TRIPLETS среды в порядке.