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

重要

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

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 のインストール パスに置き換えます %VCPKG_ROOT%

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"
}

vcpkg リポジトリの特定のコミット SHA に設定 builtin-baseline すると、その特定のコミットのパッケージ バージョンをすべてのパッケージの最小バージョンとして使用するように 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"
}

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

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

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

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.1 は両方の fmt 制約を満たします。 ベースライン バージョンを取得する方法 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" 含まれるパッケージは、他のすべてのバージョン制約を無視しながら、指定されたバージョンを使用します。 この例では、ベースライン3426db05b996481ca31e95fff3734cf23e0f51bcによって最小バージョン制約zlib1.2.11が追加されますが、オーバーライド宣言では代わりにバージョン1.2.8が強制されます。

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

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 によるバージョン解決の処理方法の詳細については、バージョン 管理の 概念と リファレンスを参照 してください。

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