教程:安装特定版本的包
了解如何在项目中使用 kmpkg 安装特定版本的依赖项。
此功能仅在清单模式 中可用。
kmpkg 允许您控制项目中每个依赖项的精确版本。
在本教程中,您将学习:
Prerequisites
- A terminal
- A code editor
- kmpkg
- 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)
kmpkg 清单 (kmpkg.json):
{
"dependencies": [ "fmt", "zlib" ]
}
构建项目,将 $KMPKG_CMAKE 替换为您的 kmpkg 安装路径:
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=$KMPKG_CMAKE
cmake --build build
运行程序:
fmt version is 70103
zlib version is 1.2.11
当您运行程序时,这些库的版本很可能与输出如上。在下一步中,我们将向您展示如何锁定这些依赖项的版本,以便 每次构建项目时它们都保持一致。
2 - 使用基线添加版本约束
版本基线为所有软件包建立了最低版本底线。阅读kmpkg概念 了解基线。
要获取上一步中使用的确切版本,请将“kmpkg.json”的内容修改为:
{
"dependencies": [
"fmt",
"zlib"
],
"builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc"
}
将 builtin-baseline 设置为特定提交kmpkg 存储库的SHA。 指示 kmpkg 使用该特定提交的软件包版本作为最低版本
所有软件包的版本。
您可以使用 Git 检查该特定基线的版本:
PowerShell
git show 3426db05b996481ca31e95fff3734cf23e0f51bc:versions/baseline.json | Select-String -Pattern '"zlib"|"fmt"' -Context 0,3
bash
git show 3426db05b996481ca31e95fff3734cf23e0f51bc:versions/baseline.json | egrep -A 3 -e '"zlib"|"fmt"'
输出应类似于以下内容:
"fmt": {
"baseline": "7.1.3",
"port-version": 1
},
--
"zlib": {
"baseline": "1.2.11",
"port-version": 9
},
3 - 更新基线版本
基线提供了一种方便的机制来立即更新所有依赖项的版本。到 更新您的基线运行以下命令:
kmpkg x-update-baseline
x-update-baseline 命令修改您的清单文件以设置
builtin-baseline 到当前的 Git 提交
kmpkg 实例。
您可以使用 --add-initial-baseline 选项将 builtin-baseline 添加到清单中
还没有。
4 - 添加最低版本约束
基线并不是锁定软件包版本的唯一方法。 kmpkg 也接受最低版本形式为 version>= 的约束。
将“kmpkg.json”的内容修改为:
{
"dependencies": [
{
"name": "fmt",
"version>=": "10.1.1"
},
"zlib"
],
"builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc"
}
上面的清单文件使用依赖对象在 fmt 上设置最小版本约束(version>=)的符号。为了满足
依赖关系 kmpkg 需要满足两个约束,一个来自基线,另一个来自基线来自“依赖项”列表中的最小版本约束。
- 基线约束,
"version>=: "7.1.3"。 - 依赖项列表约束,
"version>=": "10.1.1"。
构建并运行项目,将 $KMPKG_ROOT 替换为您的 kmpkg 安装路径:
rm -r build
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=%KMPKG_ROOT%/scripts/buildsystems/kmpkg.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。
kmpkg 允许您通过使用版本覆盖来解决这些问题。
将kmpkg.json内容修改为:
{
"dependencies": [
{
"name": "fmt",
"version>=": "10.1.1"
},
"zlib"
],
"builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc",
"overrides": [
{
"name": "zlib",
"version": "1.2.8"
}
]
}
“覆盖”列表中包含的任何包都将使用指定的版本,同时忽略所有包
其他版本限制。在此示例中,基线3426db05b996481ca31e95fff3734cf23e0f51bc
在 zlib 上添加了 1.2.11 的最低版本限制,但覆盖声明强制版本
改为 1.2.8。
构建并运行项目,将 $KMPKG_ROOT 替换为您的 kmpkg 安装路径:
rm -r build
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=%KMPKG_ROOT%/scripts/buildsystems/kmpkg.cmake
cmake --build build
./build/main
输 出应如下所示:
fmt version is 100100
zlib version is 1.2.8
后续步骤
在本教程中,您学习了 kmpkg 提供的不同机制来锁定特定的 软件包版本。阅读版本控制 概念 并 参考 了解有关 kmpkg 如何处理版本解析的更多信息。
以下是接下来要尝试的一些其他任务: