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


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

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

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

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

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

Пример #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-systemqtkeychain будут разрешаться в реестр по умолчанию.

Наложения

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

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

  1. Наложение из командной строки в указанном порядке; затем
  2. Наложения из vcpkg-configuration.json исправный; тогда
  3. Наложения из VCPKG_OVERLAY_[PORTS|TRIPLETS]переменных среды в порядке.