教學課程:安裝特定版本的套件
重要
此功能僅適用於 指令清單模式。
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.1
fmt
滿足這兩個條件約束。 請注意如何 zlib
取得其基準版本 1.2.11
。
5 - 強制特定版本
在某些情況下,您可能想要強制特定版本的套件,例如:
- 若要解決版本衝突。
- 若要鎖定比基準還舊的版本。
- 若要鎖定其他無法比對的版本,例如:
vista
、xp
。
vcpkg 可讓您使用版本覆寫來解決這些問題。
將 vcpkg.json
內容修改為:
{
"dependencies": [
{
"name": "fmt",
"version>=": "10.1.1"
},
"zlib"
],
"builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc",
"overrides": [
{
"name": "zlib",
"version": "1.2.8"
}
]
}
清單中包含 "overrides"
的任何套件都會使用指定的版本,同時忽略所有其他版本條件約束。 在此範例中,基準3426db05b996481ca31e95fff3734cf23e0f51bc
會在 上zlib
1.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 如何處理版本解析。
以下是一些其他工作,可嘗試下一步: