次の方法で共有


チュートリアル: パッケージの特定のバージョンをインストールする

重要

この機能は、マニフェスト モード でのみ使用できます。

vcpkg を使用すると、プロジェクト内の各依存関係の正確なバージョンを制御できます。

このチュートリアルでは、次の方法について学習します。

前提 条件

  • ターミナル
  • コード エディター
  • vcpkg
  • CMake

1 - マニフェストを使用してプロジェクトを作成する

空のフォルダーに、次のプロジェクト ファイルを作成します。

ソース ファイル (main.cpp):

#include <fmt/core.h>
#include <zlib.h>

int main()
{
    fmt::print("fmt version is {}\n"
               "zlib version is {}\n", 
               FMT_VERSION, ZLIB_VERSION);
    return 0;
}

CMake プロジェクト ファイル (CMakeLists.txt):

cmake_minimum_required(VERSION 3.18)

project(versionstest CXX)

add_executable(main main.cpp)

find_package(ZLIB REQUIRED)
find_package(fmt CONFIG REQUIRED)
target_link_libraries(main PRIVATE ZLIB::ZLIB fmt::fmt)

vcpkg マニフェスト (vcpkg.json):

{
  "dependencies": [ "fmt", "zlib" ]
}

プロジェクトをビルドし、%VCPKG_ROOT% を vcpkg のインストール パスに置き換えます。

cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=%VCPKG_ROOT%/scripts/buildsystems/vcpkg.cmake
cmake --build build

プログラムを実行します。

fmt version is 70103
zlib version is 1.2.11

プログラムを実行すると、これらのライブラリのバージョンが上記の出力と異なる可能性があります。 次の手順では、プロジェクトをビルドするたびに一貫性を保つよう、これらの依存関係のバージョンをロックする方法について説明します。

2 - ベースラインを使用してバージョン制約を追加する

バージョンベースラインは、すべてのパッケージの最小バージョンフロアを確立します。 vcpkg の概念 を読み、ベースラインについて学習します。

前の手順で使用した正確なバージョンを取得するには、vcpkg.json の内容を次の内容に変更します。

{
  "dependencies": [
    "fmt",
    "zlib"
  ],
  "builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc"
}

builtin-baseline を vcpkg リポジトリの特定のコミット SHA に設定すると、vcpkg は、その特定のコミットのパッケージ バージョンを、すべてのパッケージの最小バージョンとして使用するように指示します。

Git を使用して、その特定のベースラインのバージョンを調べることができます。

git show 3426db05b996481ca31e95fff3734cf23e0f51bc:versions/baseline.json | Select-String -Pattern '"zlib"|"fmt"' -Context 0,3

出力は次のようになります。

    "fmt": {
      "baseline": "7.1.3",
      "port-version": 1
    },
--
    "zlib": {
      "baseline": "1.2.11",
      "port-version": 9
    },

3 - ベースライン バージョンを更新する

ベースラインは、すべての依存関係のバージョンを一度に更新するための便利なメカニズムを提供します。 ベースラインを更新するには、次のコマンドを実行します。

vcpkg x-update-baseline

x-update-baseline コマンドは、vcpkg インスタンスの現在の Git コミットに builtin-baseline を設定するようにマニフェスト ファイルを変更します。

--add-initial-baseline オプションを使用して、まだ存在しないマニフェストに builtin-baseline を追加できます。

4 - 最小バージョン制約を追加する

ベースラインは、パッケージのバージョンをロックダウンする唯一の方法ではありません。 vcpkg は、version>=の形式で最小バージョンの制約も受け入れます。

vcpkg.json の内容を次の内容に変更します。

{
  "dependencies": [
    {
        "name": "fmt",
        "version>=": "10.1.1"
    },
    "zlib"
  ],
  "builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc"
}

上記のマニフェスト ファイルでは、依存関係オブジェクトの 表記を使用して、fmtの最小バージョン制約 (version>=) を設定します。 依存関係を満たすには、vcpkg が 2 つの制約を満たす必要があります。1 つはベースラインから取得され、1 つは dependencies リストの最小バージョン制約から取得されます。

  • ベースライン制約、"version>=": "7.1.3"
  • 依存関係リストの制約、"version>=": "10.1.1"

プロジェクトをビルドして実行し、%VCPKG_ROOT% を vcpkg のインストール パスに置き換えます。

rm -r build
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=%VCPKG_ROOT%/scripts/buildsystems/vcpkg.cmake
cmake --build build
./build/main

出力は次のようになります。

fmt version is 100100
zlib version is 1.2.11

この場合、バージョン 10.1.1fmt は両方の制約を満たします。 zlib がそのベースラインバージョン 1.2.11を取得する様子に注目してください。

5 - 特定のバージョンを強制する

場合によっては、次のような特定のバージョンのパッケージを強制的に作成することが必要になる場合があります。

  • バージョンの競合を解決するため。
  • ベースラインより古いバージョンをロックダウンする。
  • 比較できないバージョンをロックダウンするには、例: vistaxpのようにします。

vcpkg を使用すると、バージョンのオーバーライドを使用してこれらの問題を解決できます。

vcpkg.json の内容を次の内容に変更します。

{
  "dependencies": [
    {
        "name": "fmt",
        "version>=": "10.1.1"
    },
    "zlib"
  ],
  "builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc", 
  "overrides": [
    { 
        "name": "zlib", 
        "version": "1.2.8"
    }
  ]
}

"overrides" 一覧に含まれるパッケージは、他のすべてのバージョン制約を無視しながら、指定されたバージョンを使用します。 この例では、ベースライン 3426db05b996481ca31e95fff3734cf23e0f51bc1.2.11zlib に最小バージョン制約を追加しますが、オーバーライド宣言では代わりにバージョン 1.2.8 が強制されます。

プロジェクトをビルドして実行し、%VCPKG_ROOT% を vcpkg のインストール パスに置き換えます。

rm -r build
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=%VCPKG_ROOT%/scripts/buildsystems/vcpkg.cmake
cmake --build build
./build/main

出力は次のようになります。

fmt version is 100100
zlib version is 1.2.8

次の手順

このチュートリアルでは、vcpkg が特定のパッケージ バージョンをロックダウンするために提供するさまざまなメカニズムについて説明しました。 vcpkg がバージョン解決を処理する方法の詳細については、バージョン管理 概念リファレンス を参照してください。

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