教學課程:安裝特定版本的套件

重要

此功能僅適用於 指令清單模式

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命令會修改您的指令清單檔案,以設定builtin-baseline為 vcpkg 實例目前的 Git 認可。

您可以使用 --add-initial-baseline 選項,將 新增 builtin-baseline 至還沒有的指令清單。

4 - 新增最低版本條件約束

基準不是鎖定套件版本的唯一方法。 vcpkg 也接受 格式的最低版本條件約束 version>=

將的內容 vcpkg.json 修改為:

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

指令清單檔會使用相依性物件表示法,在上fmt設定最低版本條件約束 (version>=) 。 為了滿足相依性 vcpkg 需要滿足兩個條件約束,一個來自基準,另一個來自清單中的最低版本條件約束 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" 的任何套件都會使用指定的版本,同時忽略所有其他版本條件約束。 在此範例中,基準3426db05b996481ca31e95fff3734cf23e0f51bc會在 上zlib1.2.11新增最低版本條件約束,但覆寫宣告會強制版本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 如何處理版本解析。

以下是一些其他工作,可嘗試下一步: