教學課程:安裝特定版本的套件
重要
此功能僅適用於 指令清單模式。
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 - 強制特定版本
在某些情況下,您可能想要強制特定版本的套件,例如:
- 若要解決版本衝突。
- 若要鎖定比基準還舊的版本。
- 若要鎖定其他無法比對的版本,例如:
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 安裝路徑取代 %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 如何處理版本解析,請閱讀版本設定 概念 和 參考。
以下是一些可以嘗試的其他任務: