VCPKG:创建本地注册表替代远程以冻结包版本并避免重复查询
基于VCPKG git-tree创建本地注册表冻结包版本的方案
一、搭建本地注册表基础结构
- 新建本地注册表根文件夹,比如
./local-vcpkg-registry - 在根文件夹下创建
ports目录,将你从%APPDATA%/local/vcpkg/git-tree中复制并重命名为端口名的文件夹(如zlib、fmt)放入此目录 - 在根文件夹下创建
versions目录,用于存储包的版本与哈希映射数据
二、利用git-tree中的baseline生成版本数据库
git-tree中带baseline.json的文件夹存储了首次安装时的包版本基线,直接复用即可:
- 复制git-tree中的
baseline.json到本地注册表的versions目录下,保留文件名 - 跳过官方
vcpkg add version命令(避免崩溃问题),手动为每个端口创建版本文件:- 在
versions目录下,按包名首字母创建二级文件夹(如fmt对应f-f,zlib对应z-z) - 在二级文件夹内创建
<包名>.json,内容参考baseline.json中对应包的条目,格式示例:{ "versions": [ { "git-tree": "<对应git-tree中UUID文件夹的哈希值>", "version": "9.1.0", "port-version": 0 } ] } - 其中
git-tree哈希可直接从baseline.json的对应包条目里提取,无需自行计算
- 在
三、配置项目指向本地注册表
修改项目根目录的vcpkg-configuration.json,替换远程注册表为本地路径:
{ "registries": [ { "kind": "local", "name": "my-local-registry", "path": "./local-vcpkg-registry" } ], "default-registry": null }
四、处理依赖包
git-tree中a-、b-等前缀的文件夹是目标包的依赖,按以下方式复用:
- 将这些文件夹复制到本地注册表的
ports目录,并重命名为对应的包名(可从文件夹内的vcpkg.json中查看包名) - 参照步骤二,在
versions目录为每个依赖包创建对应的版本文件,确保依赖链完整
五、验证效果
执行vcpkg install或触发CMake重建,VCPKG会直接查询本地注册表,检测到已安装的包后提示“所有所需包已安装”,不再访问远程注册表。
内容的提问来源于stack exchange,提问作者user34829
相关产品推荐
相关产品推荐

