マニフェスト モードとは

vcpkg には、 クラス モードとマニフェスト モードの 2 つの操作モード があります。 ほとんどのユーザーには、マニフェスト モードをお勧めします。

マニフェスト モードでは、宣言型 JSON ファイルを使用して、プロジェクトまたはパッケージに関するメタデータを記述します。 マニフェスト ファイルには、 vcpkg.json 名が必要です。

マニフェスト モードは、作業ディレクトリにマニフェスト ファイル (vcpkg.json) がある間に vcpkg install コマンドを実行することによって実行されます。 マニフェスト モードでパッケージを インストールする方法の詳細については、先に読んでください

マニフェスト モードは、バージョン管理custom レジストリなどの高度な機能を使用する場合にも必要です

ポート内のマニフェスト ファイル

すべての 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 ファイルを使用して構成して、 パッケージ レジストリ または overlay ポートとトリプレット の場所を追加できます。

構成ファイルの例

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

マニフェスト モードでのパッケージのインストール

マニフェスト ファイルを使用してパッケージをインストールするには、パッケージ引数を指定せずに vcpkg install コマンドを使用します。 コマンドは、マニフェスト (vcpkg.json) ファイルを含むディレクトリ、または --x-manifest-root=<path> オプションを使用して提供されるマニフェスト ファイルへのパスから実行する必要があります。

マニフェスト モードでインストールされたパッケージは、クラシック モードの場合と同様に、グローバル installed ディレクトリにはインストールされません。 代わりに、各マニフェストは、 vcpkg_installedという名前の独自のインストール ディレクトリを取得します。 vcpkg_installed ディレクトリは、マニフェスト ファイルを含む同じディレクトリに作成されます。

マニフェストごとに独立したインストール ツリーを使用すると、異なるプロジェクト間で依存関係を分離できます。 これにより、クラシック モードの重要な制限が回避され、各ポートの 1 つのバージョンのみをインストールできます。 マニフェスト モードでは、プロジェクトごとに分離されたポートのバージョンが保持されます。

プロジェクト マニフェストでの機能の使用

マニフェスト ファイルでは、 機能"を使用して、機能、動作、依存関係の追加セットを定義できます。

プロジェクトでは、プロジェクトの一部に適用される依存関係を有効または無効にする機能を定義できます。 たとえば、プロジェクトに複数のコンポーネントが含まれている場合は、共通の依存関係を "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

次のステップ

次に試すタスクを次に示します。