Что такое режим манифеста?

vcpkg имеет два режима работы: классический режим и режим манифеста. Для большинства пользователей мы повторно коммутируем режим манифеста.

В режиме манифеста используются декларативные JSON-файлы для описания метаданных проекта или пакета. В любом случае это имя файла vcpkg.json.

Режим манифеста занят, выполнив vcpkg install команду, пока в рабочем каталоге есть файл манифеста (vcpkg.json). Прочтите дополнительные сведения о том, как установить пакеты в режиме манифеста.

Кроме того, для использования расширенных функций, таких как управление версиями и пользовательские реестры, также требуется режим манифеста.

Файлы манифеста в портах

Все порты vcpkg должны содержать vcpkg.json файл, описывающий метаданные о устанавливаемом пакете.

vcpkg использует метаданные в манифесте пакета для различных целей, таких как вычисление деревьев зависимостей, поиск пакетов по имени или описанию, разрешение функций и т. д.

Пример манифеста пакета

{
  "name": "fmt",
  "version": "10.1.1",
  "description": "Formatting library for C++. It can be used as a safe alternative to printf or as a fast alternative to IOStreams.",
  "homepage": "https://github.com/fmtlib/fmt",
  "license": "MIT",
  "dependencies": [
    {
      "name": "vcpkg-cmake",
      "host": true
    },
    {
      "name": "vcpkg-cmake-config",
      "host": true
    }
  ]
}

Файлы манифеста в проектах

Основной целью использования файла манифеста в проекте является объявление зависимостей. При использовании манифеста проекта можно указать ограничения версий и переопределить для блокировки определенных версий зависимостей. Эта функция недоступна в классическом режиме.

Пример манифеста проекта

{
  "dependencies": [ "fmt", "zlib" ],
  "builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc",
  "overrides": [
    { "name": "zlib", "version": "1.2.8" }
  ]
}

Файл конфигурации

vcpkg можно настроить с помощью vcpkg-configuration.json файла, чтобы добавить дополнительные реестры пакетов или наложить порты и тройные расположения.

Пример файла конфигурации

{
  "default-registry": {
    "kind": "git",
    "baseline": "7476f0d4e77d3333fbb249657df8251c28c4faae",
    "repository": "https://github.com/microsoft/vcpkg"
  },
  "registries": [
    {
      "kind": "git",
      "repository": "https://github.com/northwindtraders/vcpkg-registry",
      "baseline": "dacf4de488094a384ca2c202b923ccc097956e0c",
      "packages": [ "beicode", "beison" ]
    }
  ],
  "overlay-ports": [
    "C:\\dev\\my_vcpkg_ports"
  ]
}

Установка пакетов в режиме манифеста

Чтобы установить пакеты с помощью файла манифеста, вы используете vcpkg install команду без каких-либо аргументов пакета. Команда должна выполняться из каталога, содержащего файл манифеста (vcpkg.json) или путь к файлу манифеста, предоставленному --x-manifest-root=<path> с помощью параметра.

Пакеты, установленные в режиме манифеста, не будут установлены в глобальном installed каталоге, так как они выполняются в классическом режиме. Вместо этого каждый манифест получает собственный каталог установки с именем vcpkg_installed; vcpkg_installed каталог создается в том же каталоге, который содержит файл манифеста.

Наличие независимых деревьев установки для каждого манифеста позволяет разделить зависимости между различными проектами. Это позволяет обойти важное ограничение классического режима, которое позволяет устанавливать только одну версию каждого порта. Режим манифеста сохраняет версии портов, разделенных на каждый проект.

Использование функций в манифестах проекта

Файлы манифеста могут определять аддитивные наборы функций, поведения и зависимостей с помощью функций.

В проектах можно определить функции для включения или отключения зависимостей, которые применяются к частям проекта. Например, если проект содержит несколько компонентов, может потребоваться сохранить общие зависимости в "dependencies" списке, но ограничить некоторые другие компоненты соответствующими компонентами.

Чтобы включить функции проекта, можно использовать один из следующих методов:

Пример: функции в манифестах проекта

{
  "name": "my-game",
  "dependencies": [ "grpc" ],
  "features": {
    "client": {
      "description": "client game executable",
      "dependencies": [ "sdl2", "bullet3" ]
    }, 
    "server": {
      "description": "multiplayer server executable",
      "dependencies": [ "proxygen" ]
    }, 
    "tests": {
      "description": "development tests",
      "dependencies": [ "gtest" ]
    }
  }
} 

Чтобы создать только зависимости клиента, выполните следующие действия:

vcpkg install --x-feature=client

Следующие шаги

Ниже приведены некоторые задачи, которые необходимо выполнить следующим образом: