版本控制
vcpkg 在没有在 vcpkg.json 中显式指定库版本的情况下依然能拉取对应版本的库,是因为它使用了 版本解析机制 和 默认版本数据库。下面详细解释其工作原理:
一、vcpkg 如何确定库版本
-
版本控制机制 vcpkg 引入了 版本控制功能(versioning)(2021 年之后引入),支持如下几种方式选择库版本:
- baseline 版本(基线版本)
- 版本约束(version>、version=、port-version)
- 可重复构建(lockfile + manifests)
-
默认行为:基于 baseline 的版本选择 当你在
vcpkg.json中只写了库名,比如:{ "name": "my-project", "version": "1.0.0", "dependencies": ["fmt", "spdlog"] }vcpkg会使用 当前 vcpkg 仓库中的 baseline,为每个库选择一个推荐的版本。-
baseline 是
vcpkg官方维护的一个 JSON 文件,路径如下:vcpkg/versions/baseline.json它记录了所有库在当前 vcpkg 仓库 HEAD 所对应的推荐版本(一般是最新稳定版)。
-
-
没有写版本号仍能工作? 是因为:
- vcpkg 默认启用了版本控制;
- 没有指定版本时,自动采用 baseline 所推荐的版本;
- 如果你不使用
vcpkg.json(而是 classic mode),它会拉取当前 vcpkg 仓库中默认的 HEAD 版本的 port 构建。
二、如何查看某个库的可用版本?
可以使用命令:
vcpkg x-add-version --help # 显示版本机制
vcpkg search fmt # 搜索库
vcpkg x-history fmt # 查看该库的版本历史也可以在 vcpkg/versions 目录下查看:
versions/baseline.json:记录当前默认版本versions/f-/fmt.json:记录fmt所有可用版本
三、如何锁定特定版本?
如果你希望更精确地控制版本,应该在 vcpkg.json 中显式写明,例如:
{
"name": "my-project",
"version": "1.0.0",
"dependencies": [
{
"name": "fmt",
"version>=": "9.0.0"
}
]
}也可以使用 "version=" 精确锁定。
四、构建可复现项目(可选)
建议配合 vcpkg-lock.json 使用,确保多人协作或 CI 上构建版本一致:
vcpkg install --feature-flags=manifests
# 或用 --x-lockfile=...总结
| 情况 | 版本来源 |
|---|---|
vcpkg.json 中无版本 | 使用 baseline.json 中推荐版本 |
| 有版本约束(version>=, version=) | 精确匹配指定版本 |
| 不使用 manifest 模式(classic) | 使用 ports 当前 HEAD 的版本 |
| 配合 lockfile | 保证可复现构建 |
Triplet
- https://learn.microsoft.com/en-us/vcpkg/concepts/triplets
- https://learn.microsoft.com/en-us/vcpkg/users/triplets
更多参考: