パッケージの名前解決
vcpkg は、ネットワークに接続する前に、各パッケージの責任あるレジストリ (またはオーバーレイ) を決定します。 これにより、名前解決は外部の状態に依存しないため、パッケージの依存関係の混乱攻撃を防ぐことができます。
名前解決アルゴリズムの手順は次のとおりです。
- 名前が overlay で見つかった場合は、そのオーバーレイを使用します。それ以外の場合は使用します。
- が存在する場合は、次の
"packages"
ポート名に一致するパターン。そのレジストリを使用します。然も無くば - 既定のレジストリが
null
されていない場合は、そのレジストリを使用します。それ以外の場合は使用します。 - レジストリへのポートを解決できません。
名前と一致する複数の "packages"
パターンがある場合、vcpkg は次のように優先順位を付けます。
- 完全一致 --
boost
が選択されますboost*
- 最も長いパターン --
boost*
が選択されますb*
- 最初の一致 -- 最適なパターンを宣言する最初のレジストリが選択されます
例 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-system
とqtkeychain
を追加します。
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-system
と qtkeychain
は既定のレジストリに解決されます。
オーバーレイ
オーバーレイは、完全なレジストリを作成せずに、追加のポートと追加のトリプレットで vcpkg を拡張する方法です。 オーバーレイは、レジストリ参照またはバージョン管理を実行する前に考慮され、組み込みのトリプレットまたはポートを置き換えます。 詳細については、 overlay ポート を参照してください。
オーバーレイ設定は、次の順序で評価されます。
- コマンド行から渡された順序でオーバーレイします。
- のオーバーレイ
vcpkg-configuration.json
順に;そうしたら VCPKG_OVERLAY_[PORTS|TRIPLETS]
環境変数からのオーバーレイ順に表示されます。
vcpkg