Skip to main content
Version: 1.1.1

教程:安装特定版本的包

了解如何在项目中使用 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 - 强制使用特定版本

在某些情况下,您可能想要强制使用特定版本的包,例如:

  • 解决版本冲突。
  • 锁定早于基线的版本。
  • 锁定无法比较的版本,例如:vistaxp

kmpkg 允许您通过使用版本覆盖来解决这些问题。

kmpkg.json内容修改为:

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

“覆盖”列表中包含的任何包都将使用指定的版本,同时忽略所有包 其他版本限制。在此示例中,基线3426db05b996481ca31e95fff3734cf23e0f51bczlib 上添加了 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 如何处理版本解析的更多信息。

以下是接下来要尝试的一些其他任务: