次の方法で共有


バージョン管理のトラブルシューティング ガイド

このガイドは、バージョン管理で問題が発生しているユーザーを対象としています。

ポートのバージョンファイルの確認

手記

以下で説明するプロセスは、vcpkg レジストリからのポートに対して機能することを目的としています。 カスタム レジストリでのバージョン管理データベースの実装方法については、レジストリの に関するドキュメントを参照してください。

特定のポートのバージョン データベースを検査するには:

  1. vcpkg/versions ディレクトリに移動します。
  2. ポートのフォルダーを見つけます。
    • ポートの最初の文字に対応するフォルダーを見つけます。 たとえば、fmtf-という名前のフォルダーを開きます。
  3. ポート バージョン ファイルを開きます。
    • ポートの名前が同じ JSON ファイルを見つけます。 たとえば、fmt バージョン ファイルの名前は fmt.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.

この問題を解決するには:

  1. バージョン データベースを更新します。
    • 必要なバージョンが、バージョン データベースのローカル コピーに含まれていない可能性があります。 その場合は、git pull コマンドを実行して、vcpkg レジストリ を最新のコミットに更新します。
  2. 使用可能なバージョンを確認します。
    • バージョン データベースで使用可能なバージョンのいずれかを選択します。
  3. マニフェスト ファイルを更新します。
    • vcpkg.json ファイルを編集します。
    • 指定したバージョンを vcpkg リポジトリで使用できるバージョンに変更します。 たとえば、"version>=": "100.0.0" から "version>=": "10.1.1" に変更します。
  4. 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.

決議

  1. 互換性のあるバージョン スキームを使用します。
    • versions/b-/boost-regex.json の vcpkg リポジトリ内のバージョン データベースを調べて、ベースラインと同じバージョン管理スキームを使用する boost-regex のバージョンを見つけます。
    • vcpkg.jsonversion>= 制約を、互換性のあるスキームを使用するバージョンに更新します。
  2. 目的のバージョンにオーバーライドします:
    • 別のバージョン管理スキームを使用する特定のバージョンの boost-regex が必要な場合は、マニフェストでオーバーライドできます。
    • 目的のバージョンを指定する overrides セクションを含むように vcpkg.json を変更します。
    {
      "dependencies": [
        { "name": "boost-regex" }
      ],
      "overrides": [
        { "name": "boost-regex", "version": "1.75.0" }
      ]
    }
    

原因: 原因: シャロー クローンでの不十分なコミット履歴

vcpkg が限られたコミット履歴 (浅いクローン) で複製された場合、特定のバージョンの制約またはベースラインを解決するために必要なコミット履歴がありません。 vcpkg が特定のバージョンのポートを取得するために使用する Git ツリー オブジェクト ハッシュは、完全なコミット履歴がチェックアウトされている場合にのみ使用できます。vcpkg は、浅いリポジトリに複製された時点を検出し、ポート バージョンの取得に失敗したときにエラー メッセージを生成します。

たとえば、次のような特定のベースラインで 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) が浅い複製で使用できないことを示します。

決議

  1. 完全な複製に変換する

    • この問題の最も簡単な解決策は、完全なクローンに変換することです。
    git fetch --unshallow
    
  2. 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"default-features": false 設定を推移的な依存関係の Xに反映しないため、既定の機能を持つ X がインストールされます。

解像度

X などの推移的な依存関係が既定の機能なしでインストールされるようにするには、最上位レベルのマニフェストで依存関係をダイレクトするように昇格させ、既定の機能を明示的に無効にする必要があります。 vcpkg.json"default-features": falseで直接Xを含むように変更します。

{
  "name": "my-project",
  "dependencies": [
    {
      "name": "Y",
      "features": ["featureB"]
    },
    {
      "name": "X",
      "default-features": false
    }
  ]
}

この方法では、X が既定の機能なしでインストールされることが保証されます。X は、既定の機能を除外するための明示的な指示との直接的な依存関係になっています。

既定の機能のしくみとその管理方法の詳細については、既定の機能の概念 記事 参照してください。

問題はここに記載されていません

問題がここに記載されていない場合は、リポジトリ アクセスして新しい問題を作成してください。