パッケージの名前解決

vcpkg は、ネットワークに接続する前に、各パッケージの責任あるレジストリ (またはオーバーレイ) を決定します。 これにより、名前解決は外部の状態に依存しないため、パッケージの依存関係の混乱攻撃を防ぐことができます。

名前解決アルゴリズムの手順は次のとおりです。

  • 名前が overlay で見つかった場合は、そのオーバーレイを使用します。それ以外の場合は使用します。
  • が存在する場合は、次の "packages" ポート名に一致するパターン。そのレジストリを使用します。然も無くば
  • 既定のレジストリnullされていない場合は、そのレジストリを使用します。それ以外の場合は使用します。
  • レジストリへのポートを解決できません。

名前と一致する複数の "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: 既定のレジストリに複数のパターンを割り当てる

既定のレジストリは、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": ["*"]
    }
  ]
}

2 番目の形式の利点は、パッケージ配列にさらにエントリを追加できるのに対し、 "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 はカスタム レジストリでポートを見つけることができないため、インストールは失敗します。

これは、代わりにこれらのパッケージを既定のレジストリに割り当てることで修正できます。 これを実現するには、既定のレジストリを宣言する方法を変更し、その"packages"配列にqt-advanced-docking-systemqtkeychainを追加します。

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 を拡張する方法です。 オーバーレイは、レジストリ参照またはバージョン管理を実行する前に考慮され、組み込みのトリプレットまたはポートを置き換えます。 詳細については、 overlay ポート を参照してください。

オーバーレイ設定は、次の順序で評価されます。

  1. コマンド行から渡された順序でオーバーレイします。
  2. のオーバーレイ vcpkg-configuration.json 順に;そうしたら
  3. VCPKG_OVERLAY_[PORTS|TRIPLETS] 環境変数からのオーバーレイ順に表示されます。