バージョン管理のトラブルシューティング ガイド
このガイドは、バージョン管理で問題 が発生しているユーザーを対象としています。
ポートのバージョン ファイルの検査
Note
以下で説明するプロセスは、vcpkg レジストリからのポートに対して 機能することを目的としています。 カスタム レジストリでのバージョン管理データベースの実装方法については、レジストリ ドキュメントを参照してください。
特定のポートのバージョン データベースを検査するには:
vcpkg/versions
ディレクトリに移動します。- ポートのフォルダーを見つけます。
- ポートの最初の文字に対応するフォルダーを見つけます。 たとえば、という名前
f-
のfmt
フォルダーを開きます。
- ポートの最初の文字に対応するフォルダーを見つけます。 たとえば、という名前
- ポート バージョン ファイルを開きます。
- ポートの名前が同じ JSON ファイルを見つけます。 たとえば、バージョン ファイルの
fmt
名前はfmt.json.
- ポートの名前が同じ JSON ファイルを見つけます。 たとえば、バージョン ファイルの
ポートのバージョン ファイルには、使用可能なバージョンの一覧と、バージョン タグとそれに対応する Git ツリー オブジェクト ハッシュなどの詳細が含まれています。 この情報は、vcpkg が特定のポート バージョンを取得するために必要です。 マニフェスト ファイルで使用できるのは、この一覧に含まれているバージョンのみです。
バージョン管理の詳細については、リファレンス ドキュメントを参照してください。
マニフェストの使用の詳細については、マニフェストを参照してください 。
原因: 存在しないバージョンのパッケージを要求する
マニフェスト ファイルで指定されたバージョンが vcpkg バージョン データベースに存在しない場合、vcpkg は依存関係の解決に失敗し、次のようなエラー メッセージが生成されます。
error: no version database entry for fmt at 100.0.0
Available versions:
10.1.1
10.1.0
10.0.0
9.1.0#1
9.1.0
9.0.0
8.1.1#2
8.1.1#1
...
See `vcpkg help versioning` or https://learn.microsoft.com/vcpkg/users/versioning for more information.
この問題を解決するには:
- バージョン データベースを更新します。
- 必要なバージョンが、バージョン データベースのローカル コピーに含まれていない可能性があります。 その場合は、コマンドを
git pull
実行して vcpkg レジストリを最新のコミットに更新します。
- 必要なバージョンが、バージョン データベースのローカル コピーに含まれていない可能性があります。 その場合は、コマンドを
- 使用可能なバージョンを確認します。
- バージョン データベースで使用可能なバージョンのいずれかを選択します。
- マニフェスト ファイルを更新します。
- ファイルを編集します
vcpkg.json
。 - 指定したバージョンを vcpkg リポジトリで使用できるバージョンに変更します。 たとえば、"version>=": "100.0.0" から "version>=": "10.1.1" に変更します。
- ファイルを編集します
- vcpkg インストールを実行します。
vcpkg install
ターミナルまたはコマンド プロンプトでコマンドをもう一度実行します。
原因: 異なるスキーム間でバージョン制約を指定する
バージョン スキームの競合は、依存関係のファイルで vcpkg.json
指定されたバージョンが vcpkg リポジトリのベースライン バージョンで使用されているバージョン管理スキームとは異なるバージョン管理スキームを使用する場合に発生します。 これにより、vcpkg は異なるスキーム間でバージョンを比較できないため、エラーが発生します。
宣言された制約で、ベースライン バージョンで使用されている version>=
バージョンスキームとは異なるバージョン スキームが使用されている場合、vcpkg は、どのバージョンが他のバージョンより大きいか等しいかを判断できません。
たとえば、次のように指定します。
{
"dependencies": [
{
"name": "boost-regex",
"version>=": "1.75.0"
}
]
}
vcpkg は次のエラー メッセージを出力します。
error: version conflict on boost-regex:x64-windows: required 1.75.0, which cannot be compared with the baseline version 1.83.0.
The versions have incomparable schemes:
boost-regex@1.83.0 has scheme relaxed
boost-regex@1.75.0 has scheme string
This can be resolved by adding an explicit override to the preferred version. For example:
"overrides": [
{ "name": "boost-regex", "version": "1.83.0" }
]
See `vcpkg help versioning` or https://learn.microsoft.com/vcpkg/users/versioning for more information.
解決方法:
- 互換性のあるバージョン スキームを使用します。
- vcpkg リポジトリ
versions/b-/boost-regex.json
内のバージョン データベースを調べて、ベースラインと同じバージョン管理スキームを使用するバージョンboost-regex
を見つけます。 - 互換性のあるスキームを
version>=
vcpkg.json
使用するバージョンに制約を更新します。
- vcpkg リポジトリ
- 目的のバージョンにオーバーライドします。
- 別のバージョン管理スキームを使用する特定のバージョンの boost-regex が必要な場合は、マニフェストでオーバーライドできます。
- 目的のバージョンを指定する overrides セクションを含むように変更します
vcpkg.json
。
{ "dependencies": [ { "name": "boost-regex" } ], "overrides": [ { "name": "boost-regex", "version": "1.75.0" } ] }
原因: 浅いクローンでの不適切なコミット履歴
vcpkg が限られたコミット履歴 (浅いクローン) で複製された場合、特定のバージョンの制約またはベースラインを解決するために必要なコミット履歴がありません。 vcpkg が特定のバージョンのポートを取得するために使用する Git ツリー オブジェクト ハッシュは、完全なコミット履歴がチェックアウトされている場合にのみ使用できます。vcpkg は、浅いリポジトリに複製されたときに検出し、ポート バージョンの取得に失敗するとエラー メッセージを生成します。
たとえば、次のような特定のベースラインで a vcpkg.json
を使用するとします。
{
"dependencies": [
{
"name": "fmt"
}
],
"overrides": [
{
"name": "fmt",
"version": "7.1.3#1"
}
],
"builtin-baseline": "bb588985e37484d543fc849d0d79434e0d45bb3c"
}
次のエラーが発生します。
error: failed to execute: "C:\Program Files\Git\cmd\git.exe" "--git-dir=C:\dev\demo\vcpkg\.git" "--work-tree=C:\dev\demo\vcpkg\buildtrees\versioning_\versions\fmt\4f8427eb0bd40da1856d4e67bde39a4fda689d72_26648.tmp" -c core.autocrlf=false read-tree -m -u 4f8427eb0bd40da1856d4e67bde39a4fda689d72
vcpkg was cloned as a shallow repository in: C:\dev\demo\vcpkg\.git
Try again with a full vcpkg clone.
error: git failed with exit code: (128).
fatal: failed to unpack tree object 4f8427eb0bd40da1856d4e67bde39a4fda689d72
note: while checking out port fmt with git tree 4f8427eb0bd40da1856d4e67bde39a4fda689d72
このエラーは、パッケージfmt
の特定のバージョンに必要なコミット (4f8427eb0bd40da1856d4e67bde39a4fda689d72
) が浅い複製で使用できないことを示します。
解決方法:
完全な複製に変換する
- この問題の最も簡単な解決策は、完全なクローンに変換することです。
git fetch --unshallow
GitHub Actions の使用 (既定の浅いクローン)
- GitHub Actions では、多くの場合、既定で浅いクローンが使用されます。 これを回避するには、GitHub Actions ワークフローを変更して完全な複製を実行します。 vcpkg を使用する前に、次の手順を追加します。
- name: Convert to Full Clone run: git fetch --unshallow
原因: 推移的な依存関係に既定の機能が予期せず含まれている
vcpkg を使用して依存関係を管理する場合、プロジェクトにこれらの機能が必要ない場合でも、推移的な依存関係が既定の機能と共にインストールされている場合があります。 この状況により、最終的なビルドで予期しない肥大化や機能が発生する可能性があります。
シナリオ
ライブラリに依存しており、ライブラリ Y
に依存しています X
。 ライブラリ X
には、プロジェクトから除外する既定の機能が含まれています foo
。 ライブラリ Y
の最上位レベルのマニフェストは、次のようになります。
{
"name": "my-project",
"dependencies": [
{
"name": "Y",
"features": ["featureB"],
"default-features": false
}
]
}
この設定により"default-features": false
、既定の機能なしでインストールされる予定X
です。 ただし、 X
引き続き既定の機能 foo
でインストールされます。
理由
このプロパティは default-features
、最上位レベルのマニフェストでのみ考慮されます。 つまり、(このシナリオのように X
) 推移的な依存関係の既定の機能は、最上位レベルで明示的に無効にしない限り、引き続き含まれます。 ライブラリY
が解決されると、vcpkg
設定が推移的な依存関係X
に反映"default-features": false
されず、既定のX
機能がインストールされます。
解決方法
推移的な依存関係が X
既定の機能なしでインストールされるようにするには、最上位レベルのマニフェストで依存関係をダイレクトするように昇格させ、既定の機能を明示的に無効にする必要があります。 次を使用して直接"default-features": false
含むようにX
変更しますvcpkg.json
。
{
"name": "my-project",
"dependencies": [
{
"name": "Y",
"features": ["featureB"]
},
{
"name": "X",
"default-features": false
}
]
}
この方法では、既定の X
機能を除外する明示的な命令を使用して直接依存関係が行われるようになった X
ため、既定の機能なしでインストールされます。
既定の機能のしくみとその管理方法の詳細については、既定の機能の概念に関する記事を参照してください。
問題がこの一覧に含まれていない
問題がここに記載されていない場合は、リポジトリにアクセスして新しい問題を作成してください。
vcpkg