vcpkg manifest 的使用

news2024/12/26 21:36:56

最近项目上要使用 CMakeLists 管理,由于 Windows 版本有依赖到 vcpkg 提供的库,所以需要使用 vcpkg manifest 来统一设置库的版本,方便后续维护

推荐一个文章,介绍的可以说是非常全面了

  • VCPKG 特性 - Versioning

不过里面也有一些过时的特性,我在后面会补充一下

为了防止上面文章的链接失效,故列出一些常用的命令

这是一个完整的 vcpkg.json

{
    "name": "versions-test",
    "version": "1.0.0",
    "dependencies": [
    {
      "name": "fmt",
      "version>=": "7.1.3"
     },
     "zlib"
    ],
    "builtin-baseline": "6a349fe1fbea1e5fcda2e0775f555d829a5e82df",
    "overrides": [
    {
       "name": "fmt",
       "version": "6.0.0"
     }
    ]
}

原文中说使用 git rev-parse HEAD 获取 builtin-baseline 其实是不准确的

git rev-parse HEAD

git rev-parse HEAD 是获取 .git 中当前分支的最新 commit_id,这与库是没什么关系的,如下

// 在 cmd 中输入
C:\Users\xxx\vcpkg>git rev-parse HEAD
6a349fe1fbea1e5fcda2e0775f555d829a5e82df
C:\Users\xxx\vcpkg>git show 6a349fe1fbea1e5fcda2e0775f555d829a5e82df
commit 6a349fe1fbea1e5fcda2e0775f555d829a5e82df (HEAD -> master, origin/master, origin/HEAD, ffmpeg_test)
Author: Billy O'Neal <bion@microsoft.com>
Date:   Mon Sep 18 16:34:12 2023 -0700

    Update vcpkg-tool to 2023-09-15 (#33804)

    https://github.com/microsoft/vcpkg-tool/releases/tag/2023-09-15

diff --git a/scripts/vcpkg-tool-metadata.txt b/scripts/vcpkg-tool-metadata.txt
index eb6591bf4..c8387661b 100644
--- a/scripts/vcpkg-tool-metadata.txt
+++ b/scripts/vcpkg-tool-metadata.txt
@@ -1,5 +1,5 @@
-VCPKG_TOOL_RELEASE_TAG=2023-08-09
-VCPKG_MACOS_SHA=b46eaabbcc586b40c21f15ae8da671ce67da9022cd7acef4651bf8de81587f06074e7eb4066f521086270c01f9fa557374972159756412e852426a3ff04759d4
-VCPKG_MUSLC_SHA=114de7c643386ca2b8319bacfd83979e109abe490d4f25a23a0918fc0020f918131fb260cdb8abbbbaae7c170952e0327cf77c26cfa9135c6a1bfd7e6c0d8fca
-VCPKG_GLIBC_SHA=4aa9b734b13526385c0d034452a52edd393e9a1d11274634cd4dacf52f16a3579782a9a6069746e15c2b82257046f3be951bf7c7a03846236fb6247211308044
-VCPKG_TOOL_SOURCE_SHA=bcf05ca1f52bd5cd8274fd6e1678bd1d4f9673aecead127fe4a4d7e40c583829f60bc568cdfa9ce36f13a6cbf21d95322dd7088b011024461682813c8ab1ecb3
+VCPKG_TOOL_RELEASE_TAG=2023-09-15
+VCPKG_MACOS_SHA=3c822003ec4e5eb3ea15d8ccf1a156f1d58e742b9d375a79693af9ad5b454796d4a42e05091bafefdf8359b56aee27ff8b07ff9bcb99f549a5bc81cb7ed47cc7
+VCPKG_MUSLC_SHA=125c77acbc6a2271eb882767e44da3fb0acd0719a35f2460e65eafcccae47967a5c370206d7af06b1d5a10d4ea53d04e620ca8df4bface8cd972b27eb89cf04e
+VCPKG_GLIBC_SHA=08d27596961819573a66163ca5373e8f20137856d78d58154cc9ad0ba4864a1d22698d25c08c5ebcb3601f2952a476b0f1d12bed25c42cdbe6dab520870fabf3

// 在 git bash 中输入 git log 查看历史提交
xxx@DESKTOP-MS9D4O9 MINGW64 ~/vcpkg (master)
$ git log
commit 6a349fe1fbea1e5fcda2e0775f555d829a5e82df (HEAD -> master, origin/master, origin/HEAD, ffmpeg_test)
Author: Billy O'Neal <bion@microsoft.com>
Date:   Mon Sep 18 16:34:12 2023 -0700

    Update vcpkg-tool to 2023-09-15 (#33804)

    https://github.com/microsoft/vcpkg-tool/releases/tag/2023-09-15

commit 0a50c9623b797eb393ca852099bc3b776c34b532
Author: Fabien Péan <fabien@pean.pro>
Date:   Mon Sep 18 19:12:53 2023 +0200

    [yomm2] Update to v1.4.0 (#33509)

...

所以说用上述方法查看 builtin-baseline 是不准确的,包括后面说的使用 x-history 命令也是过时的

新方法是使用 git blame -l 方法

git blame -l versions/<port-first-char>-/<portname>.json

相关文档:How do I get history versions of a port now

实际使用:

C:\Users\xxx\vcpkg>git blame -l versions/c-/curl.json
2f6537fa2b8928d2329e827f862692112793435d port_versions/c-/curl.json (Victor Romero              2021-01-14 16:08:36 -0800   1) {
2f6537fa2b8928d2329e827f862692112793435d port_versions/c-/curl.json (Victor Romero              2021-01-14 16:08:36 -0800   2)   "versions": [
679df196c1d43210c4dfd079a47fa4bcefe44f00 versions/c-/curl.json      (Lily Wang                  2023-08-02 08:59:01 -0700   3)     {
679df196c1d43210c4dfd079a47fa4bcefe44f00 versions/c-/curl.json      (Lily Wang                  2023-08-02 08:59:01 -0700   4)       "git-tree": "1e4df4c9590fb15d2d73014c66dbbc151b624b9b",
679df196c1d43210c4dfd079a47fa4bcefe44f00 versions/c-/curl.json      (Lily Wang                  2023-08-02 08:59:01 -0700   5)       "version": "8.2.1",
679df196c1d43210c4dfd079a47fa4bcefe44f00 versions/c-/curl.json      (Lily Wang                  2023-08-02 08:59:01 -0700   6)       "port-version": 0
679df196c1d43210c4dfd079a47fa4bcefe44f00 versions/c-/curl.json      (Lily Wang                  2023-08-02 08:59:01 -0700   7)     },
864c70b8369e59c72fb71b50f2a233a91398d591 versions/c-/curl.json      (JonLiu1993                 2023-07-21 08:46:53 -0700   8)     {
864c70b8369e59c72fb71b50f2a233a91398d591 versions/c-/curl.json      (JonLiu1993                 2023-07-21 08:46:53 -0700   9)       "git-tree": "c82d0a822ec7d4044a58c18f2e198df681822cf6",
864c70b8369e59c72fb71b50f2a233a91398d591 versions/c-/curl.json      (JonLiu1993                 2023-07-21 08:46:53 -0700  10)       "version": "8.2.0",
864c70b8369e59c72fb71b50f2a233a91398d591 versions/c-/curl.json      (JonLiu1993                 2023-07-21 08:46:53 -0700  11)       "port-version": 0
864c70b8369e59c72fb71b50f2a233a91398d591 versions/c-/curl.json      (JonLiu1993                 2023-07-21 08:46:53 -0700  12)

c- 就是 versions 文件夹的子文件夹

 curl.json 是 c- 文件夹下的 json 文件

那 versions 与 builtin-baseline 是如何配合使用呢?

借助一开始文章链接,我贴出主要部分,

builtin-baseline 具体作用过程:

1. 从给定的 builtin-baseline(commit id)版本中查找是否含有 baseline.json 文件,如果有,就从这个文件中查找该库的版本。

2. 如果没有 baseline.json,就会报错。

3. 如果有 baseline.json,但是它不包含库的历史版本,也会报错。

version>=

以上示例中,zlib 的版本号 1.2.11#9 是由 version 和 port-version 两部分组成,version(1.2.11) 是 zlib 的实际的版本号,port-version(9) 是这个版本在 vcpkg 中的补丁版本。两者组合可以获取该库在 vcpkg 中的具体版本。

当 version 版本更新时,port-version 重置为 0 ,每次改动都加 1。

在 vcpkg 中,版本是如何比较大小呢?实际是比较版本的新旧,例如:

1.2.0 < 1.2.0#1 < 1.2.0#2 < 1.2.0#10
2021-01-01#20 < 2021-01-01.1
windows#7 < windows#8

注意:

1. Version>= 主要用于表示需要使用的最低版本,只有作为 "dependencies"的一部分时才是被允许的。

2. 如果使用 Version>=, vcpkg会从所有满足条件的版本中选用最低版本,这种做法的好处是更新 vcpkg 时,避免依赖升级出现异常的问题。可以总结为:

如果使用 overrides,那么会使用 overrides 提供的版本,例如 fmt 6.0.0。如果没有,会选择 version>= 和 builtin-baseline 中最高的版本,例如:

version>= 7.1.3 + builtin-baseline(7.1.4) , 会安装 fmt 7.1.4;

version>= 7.1.3 + builtin-baseline(7.1.2) , 会安装 fmt 7.1.3。

3. Vcpkg允许升级版本,例如: 如果 zlib 依赖fmt,而且声明依赖 fmt 的 7.1.4 版本,那么 vcpkg 就会安装 7.1.4 版本,而不是 7.1.3。

4. 在您的项目中,如果想升级依赖库的版本,只需把最低版本改掉,或者是把 builtin-baseline 改为更新的版本。

5. Vcpkg 不会比较version类型不同的版本,例如:同一个库的2 个版本 ‘version-string: 7.1.3’ 与 `version: 7.1.4`,version 类型不同,所以不能比较。

以上大概都是能用到的知识


下面是我在项目中遇到的一些问题包括尝试的解决方案:

第一个问题:

因为 manifest 无法识别 "triplet" 字段,故无法在 vcpkg,json 中指定该字段,只能在外部创建本地的 vcpkg 三方库

D:\my_project\build>vcpkg install --triplet x86-windows-static
Detecting compiler hash for triplet x86-windows-static...
-- Using HTTP(S)_PROXY in environment variables.
Detecting compiler hash for triplet x64-windows...
The following packages will be built and installed:
....

最后会在项目的 build 文件下生成相关库

第二个问题:

我们随便打开一个自动生成的 vcpkg.json 会发现多了一些字段,比如 “port-version”

{
  "name": "libfabric",
  "version-semver": "1.13.2",
  "port-version": 2,
  "description": "The OpenFabrics Interfaces Working Group (OFIWG) and the Libfabr...
  "homepage": "https://github.com/ofiwg/libfabric",
  "supports": "windows & !uwp & x64 & !static",
  "dependencies": [
    {
      "name": "networkdirect-sdk",
      "platform": "windows"
    },
    {
      "name": "vcpkg-msbuild",
      "host": true,
      "platform": "windows"
    }
  ]
}

“port-version” 其实就是补丁,上面有提到,那么如何获取呢?

我们拿 curl 来举例,git show xxx(git show 命令后跟着一个特定的文件路径参数可以用于查看 Git 仓库中特定文件在指定提交(17fc556532840f436f67f8d08c943d1ff97ea2f9)的版本)

C:\Users\xxx\vcpkg>git show 17fc556532840f436f67f8d08c943d1ff97ea2f9 versions/c-/curl.json
commit 17fc556532840f436f67f8d08c943d1ff97ea2f9
Author: Theodore Tsirpanis <theodore.tsirpanis@tiledb.com>
Date:   Thu Jul 13 21:24:11 2023 +0300

    [curl] Add zstd feature. (#32533)

diff --git a/versions/c-/curl.json b/versions/c-/curl.json
index ba17a0c9f..9c4f96d98 100644
--- a/versions/c-/curl.json
+++ b/versions/c-/curl.json
@@ -1,5 +1,10 @@
 {
   "versions": [
+    {
+      "git-tree": "c2681b59ec41e4ec760fe10a60385202ee4763bb",
+      "version": "8.1.2",
+      "port-version": 2
+    },
     {
       "git-tree": "7d8ee40552d5b1c103d52b2b28d9577cb45e2593",
       "version": "8.1.2",

可以看到 port_version 是 2,git-tree 是 commit-id,跟 builtin-baseline 不同,我们一般用不到它

顺便补充下图:

最下面的图显示的绿颜色字符都是新增的,说明当前分支新增了一个 8.2.1  的版本

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1100742.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

『C++ - STL』之优先级队列( priority_queue )

文章目录 前言优先级队列的结构优先级队列的模拟实现仿函数 最终代码 前言 什么是优先级队列&#xff0c;从该名中可以知道他一定有队列的一定属性&#xff0c;即先入先出(LILO)&#xff0c;而这里的优先级则可以判断出它的另一个特点就是可以按照一定的条件将符合该条件的先进…

Debian衍生桌面项目SpiralLinux12.231001发布

导读SpiralLinux 是一个从 Debian 衍生出来的桌面项目&#xff0c;其重点是在所有主要桌面环境中实现简洁性和开箱即用的可用性。 spiral Linux 是为刚接触 Linux 世界的人们量身定制的发行版。这是 GeckoLinux 开发人员的创意&#xff0c;他更喜欢保持匿名。尽管他不愿透露姓…

图文详解!带你认识 ancert:硬件兼容性标准实现工具!| 龙蜥技术

编者按&#xff1a;大家都知道 OS 其实是硬件设备资源利用的抽象&#xff0c;所以 OS 和各个硬件设备之间是否兼容&#xff0c;对 OS 的稳定性是非常关键。今天&#xff0c;龙蜥社区硬件兼容性 SIG Maintainer 吴朝峰为大家介绍龙蜥社区硬件兼容性认证的步骤和流程&#xff0c…

python项目之大学生就业信息管理系统设计与实现

项目简介 大学生就业信息管理系统实现了以下功能&#xff1a; 管理员功能&#xff1a;权限认证&#xff0c;职位管理&#xff0c;企业管理&#xff0c;留言管理&#xff0c;用户管理&#xff0c;投递管理。用户功能&#xff1a;首页&#xff0c;招聘会&#xff0c;留言板&…

5.Vue-在Vue框架中实现Vue的增删改查

题记 在vue框架中实现vue的增删改查&#xff0c;以下是具体操作流程和代码 编写TestView.vue文件 TestView.vue文件如下&#xff1a; <template> <div id"app"> <h1>学生列表</h1> <input type"text" v-model"searchQue…

Nodejs原型链污染学习

文章目录 前置知识JavaScript数据类型prototype原型同步和异步child_process模块 原型链污染利用条件 前置知识 JavaScript数据类型 let和var关键字的区别 使用var或let关键字可以定义变量 let和var的区别如下&#xff1a; var是全局作用域&#xff0c;let 只在当前代码块内…

掌握Go编程中的错误处理和日志记录

构建稳健可靠应用的全面指南 错误处理是编写可靠和稳健软件应用的重要方面。在任何编程语言中&#xff0c;错误是不可避免的&#xff0c;如何处理错误会极大地影响代码的质量和稳定性。在本文中&#xff0c;我们将探索Go中的错误处理世界&#xff0c;理解其重要性&#xff0c;…

修炼k8s+flink+hdfs+dlink(五:安装dockers,cri-docker,harbor仓库)

一&#xff1a;安装docker。&#xff08;所有服务器都要安装&#xff09; 安装必要的一些系统工具 sudo yum install -y yum-utils device-mapper-persistent-data lvm2添加软件源信息 sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/cent…

通过商品链接查询淘宝商品详情数据,可以拿到商品标题,商品价格,商品库存,商品销量,商品sku数据等,淘宝API接口

通过商品链接查询淘宝商品详情数据可以参考以下步骤&#xff1a; 打开手机淘宝或者PC端&#xff0c;复制需要查询的商品链接。打开浏览器&#xff0c;输入商品链接&#xff0c;点击搜索。点击搜索结果中的商品链接&#xff0c;进入商品详情页面。点击鼠标右键&#xff0c;选择…

【前段基础入门之】=>CSS3新特性 3D 变换

导语 在上一章节中&#xff0c;我们分享了2D 变换的效果&#xff0c;也分享了一些案例&#xff0c;同时&#xff0c;既然有2D 变换&#xff0c;那么也就肯定有 3D 变换 那么本章节&#xff0c;就为大家带来有关3D 变换的分享. 文章目录 开启3D空间设置景深透视点位置3D 位移3D …

职场中,如何更高效地分析和解决问题(一)

要在职场取得成功&#xff0c;必须掌握多种技能。这些技能大致可分为三类&#xff1a; 一是职能性技能&#xff0c;二是分析和解决问题的技能&#xff0c;三是处理人际关系的技能。 无论在生活中还是工作中&#xff0c;我们都会面临各种问题&#xff0c;有些问题可能简单易处…

Avalonia 实现跨平台的视频聊天、屏幕分享(源码,支持Win、银河麒麟、统信UOS)

现在最火的.NET跨平台UI框架莫过于Avalonia了。Avalonia 基于.NET Core&#xff0c;因此它可以运行在任何支持.NET Core的平台上。之前基于CPF跨平台UI框架写过一个视频聊天的demo&#xff0c;而现在看来Avalonia是大势所趋&#xff0c;于是&#xff0c;我再写一个Avalonia版本…

TP5.1 导出excel文件

在 ThinkPHP 5.1 中引入 PHPExcel&#xff08;现在已被官方弃用&#xff0c;推荐使用 PhpSpreadsheet&#xff09;时&#xff0c;可以按照以下步骤进行操作&#xff1a; 在 composer.json 文件中添加 PHPExcel&#xff08;PhpSpreadsheet&#xff09;的依赖项。找到 require 部…

告别单调的列表页,探索JVS低代码列表页设计的新思路

列表页是什么&#xff1f; 列表页是管理平台中的基础页面&#xff0c;核心的逻辑是实现数据的增删改查&#xff08;CRUD&#xff09;&#xff0c;列表页核心的几个要素&#xff1a;页面内容的数据展示、查询条件、页面按钮及按钮触发的逻辑。 列表页配置 具备应用配置权限的…

利用Python turtle绘制中国结附源码

一、中国结 01 平安喜乐 1&#xff09;效果图 import turtle turtle.screensize(600,800) turtle.pensize(10) turtle.pencolor("red") turtle.seth(-45) turtle.fd(102) turtle.circle(-6,180) turtle.fd(102) turtle.circle(6,180) turtle.fd(102) turtle.circle(…

5、函数式编程--方法引用

目录 6. 方法引用6.1 推荐用法6.2 基本格式6.3 语法详解(了解)6.3.1 引用类的静态方法格式使用前提 6.3.2 引用对象的实例方法格式使用前提 6.3.4 引用类的实例方法格式使用前提 6.3.5 构造器引用格式使用前提 6. 方法引用 ​ 我们在使用lambda时&#xff0c;如果方法体中只有…

如何加入开源项目维护并提交代码?本地搭建源码阅读开发构建环境示例: kafka

如何加入开源项目维护并提交代码?本地搭建源码阅读开发构建环境示例: kafka。 大家对开源项目有兴趣、想成为committer,或者工作需要,会从github上获取最新的开源项目源码。本文做一个示例,怎样搭建本地的源码阅读、开发、构建环境。 首先,在github上找到项目的链接,…

OS 进程的描述与控制

目录 前趋图 程序执行 程序顺序执行 程序并发执行 进程 定义 进程控制块 PCB 进程实体 进程 特征 动态性 并发性 独立性 异步性 状态 3 种基本状态 就绪状态 执行状态 阻塞状态 3 种基本状态间的转换 其他状态 创建状态 终止状态 进程 5 种状态及其转换…

创建JUnit4 的TestBase类

Slf4j RunWith(SpringRunner.class) SpringBootTest(classes {TestApplication.class},webEnvironment SpringBootTest.WebEnvironment.RANDOM_PORT) public class TestBase { } 如图&#xff1a;

基于Bert模型的中文语义相似度匹配算法(离线模式)

1、准备中文离线模型 配置文件夹 文件获取方法&#xff1a; 访问官网&#xff1a;https://huggingface.co/bert-base-chinese/tree/main 下载以下文件 2、测试代码 # -*- coding: utf-8 -*- #pip install transformers -i https://mirrors.aliyun.com/pypi/simple/ #pip …