共用方式為


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

重要

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

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

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 安裝路徑取代 %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

在此情況下,fmt 的版本 10.1.1 符合這兩個條件約束。 請注意 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" 清單中的任何套件都會使用指定的版本,同時忽略所有其他版本條件約束。 在此範例中,基準 3426db05b996481ca31e95fff3734cf23e0f51bczlib1.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 如何處理版本解析,請閱讀版本設定 概念參考

以下是一些可以嘗試的其他任務: