vcpkg manifest 的使用
最近项目上要使用 CMakeLists 管理,由于 Windows 版本有依赖到 vcpkg 提供的库,所以需要使用 vcpkg manifest 来统一设置库的版本,方便后续维护
推荐一个文章,介绍的可以说是非常全面了
不过里面也有一些过时的特性,我在后面会补充一下
为了防止上面文章的链接失效,故列出一些常用的命令
这是一个完整的 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 的版本
vcpkg manifest 的使用的更多相关文章
- HTML 5 应用程序缓存manifest
什么是应用程序缓存(Application Cache)? HTML5 引入了应用程序缓存,这意味着 web 应用可进行缓存,并可在没有因特网连接时进行访问. 应用程序缓存为应用带来三个优势: 离线浏 ...
- HTML5之应用缓存---manifest---缓存使用----Web前端manifest缓存
相信来查这一类问题的都是遇到问题或者是初学者吧! 没关系相信你认真看过之后就会知道明白的 这是HTML5新加的特性 HTML5 引入了应用程序缓存,这意味着 web 应用可进行缓存,并可在没有因特网连 ...
- gulp rev manifest 添加目录前缀
gulp-rev 生成的manifest默认为: "index.css": "index.css?v=04aff97a7b", 为避免同名文件覆盖版本号,对替换 ...
- 执行打的maven jar包时出现“Exception in thread "main" java.lang.SecurityException: Invalid signature file digest for Manifest main attributes”
Exception in thread "main" java.lang.SecurityException: Invalid signature file digest for ...
- 关于java中的MANIFEST.MF 文件内容
打开Java的JAR文件我们经常可以看到文件中包含着一个META-INF目录, 这个目录下会有一些文件,其中必有一个MANIFEST.MF,这个文件描述了该Jar文件的很多信息.可以简化Java应用程 ...
- 每建一个Activity都要注册权限Manifest.xml
每建一个Activity都要注册权限Manifest.xml 但是有时候自动注册好了,注意!不然的话是不能调用的!!!!!<activity android:name=".MainVi ...
- Nginx manifest 实现 HTML5 Application Cache
什么是Application Cache HTML5引入了应用程序缓存技术,意味着web应用可进行缓存,并在没有网络的情况下使用,通过创建cache manifest文件,可以轻松的创建离线应用. A ...
- jar包目录下MANIFEST.MF标准格式
jar包目录格式: |-- com | |-- test.class |-- META-INF | |-- MAINFEST.MF 一个正常的jar包下必有META-INF/MANIFEST.MF清单 ...
- c++错误——intermediate.manifest : general error c1010070很傻的错
.\Debug\sadf.exe.intermediate.manifest : general error c1010070: Failed to load and parse the manife ...
- 采用MANIFEST.MF之jar报错ClassNotFoundException解法
检查n多遍也试了n多次,证明下面是MANIFEST.MF文件正确写法: Manifest-Version: 1.0 Premain-Class: cn.yandz.monitor.SizeOfObje ...
随机推荐
- Kali-Shell简单介绍&Vim编辑器指令
Shell简单介绍 shell :外壳(用户与操作系统(内核)之间的桥梁)相当于Windows中的dos 1.查看shell cat /etc/shells 查看系统支持哪些Shell echo $s ...
- 园子的商业化努力:欢迎参加DataFun联合行行AI举办的数据智能创新与实践人工智能大会
大家好,今年是园子商业化生死攸关的一年,正在艰难而努力地向前推进,今天在首页发布一篇大会推广博文,望谅解. DataFun联合行行AI举办第四届"数据智能创新与实践人工智能大会", ...
- Win10激活步骤、密钥key
统安装完毕后,首先以Win+R打开CMD命令行窗口,按下Win+X,选择命令提示符(管理员). Win10企业版 用户举例请依次输入: slmgr /ipk NPPR9-FWDCX-D2C8J-H87 ...
- Go的语言特性有哪些
摘要:本文由葡萄城技术团队于博客园原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 前言 本文主要通过值传递和指针.字符串.数组.切片.集合.面向 ...
- Day06_Java_作业
A:简答题 1. 类是什么? 对象是什么?举例说明 2. 类由哪些内容组成? 3. 成员变量与局部变量的区别? 4. 什么是匿名对象?什么时候使用匿名对象? 5. 使用面向对象[封装]的好处有哪些? ...
- NumPy(1)-常用的初始化方法
一.NumPy介绍 NumPy是Python中科学计算的基础包,它是一个Python库,提供多维数组对象,各种派生对象(如掩码数组和矩阵),以及用于数组快速操作的各种API,有包括数学.逻辑.形状操作 ...
- 如何根据oops函数偏移快速定位源码?
如何根据函数偏移快速定位源码? 在内核栈的输出中,你一定注意到每一个函数的输出格式都是函数名+偏移量,而这儿的偏移就是调用下一个函数的位置.那么,能不能根据函数名+偏移量直接定位源码的位置呢? 答案是 ...
- 这些年写过的花式sql - 第一句 删除重复无效的记录
这些年写过的花式sql - 第一句 删除重复无效的记录 写好复杂sql可以减少代码量,经过写这些年的后台统计,我学着像写代码一样的设计和尝试sql.现整理如下: 本来想一次性写完的,不过那写起来和看起 ...
- Prompt Playground 7月开发记录
Prompt Playground 2023年7月开发记录 上个月的时候,出于日常工作需求,做了一个简单的提示词调试工具 Prompt Playground. 这个工具的初衷是为了方便测试,所以没有做 ...
- Spring Cloud Gateway Actuator API SpEL表达式注入命令执行漏洞(CVE-2022-22947)
描述: Spring Cloud Gateway 是基于 Spring Framework 和 Spring Boot 构建的 API 网关,它旨在为微服务架构提供一种简单.有效.统一的 API 路由 ...