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


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

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

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

  • Если имя найдено в наложении , используйте это наложение; в противном случае
  • Если есть "packages" шаблон, соответствующий имени порта, используйте этот реестр; иначе
  • null; в противном случае
  • Не удается разрешить порт в реестр.

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

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

Пример #1. Разрешение имен пакета

vcpkg-configuration.json

{
  "registries": [
    {
      "kind": "git",
      "repository": "https://github.com/MicrosoftDocs/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/MicrosoftDocs/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/MicrosoftDocs/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-systemqtkeychain будут разрешаться в реестр по умолчанию.

Порты наложения

Порты наложения — это способ расширения 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 среды в порядке.