版本控制

vcpkg 在没有在 vcpkg.json 中显式指定库版本的情况下依然能拉取对应版本的库,是因为它使用了 版本解析机制默认版本数据库。下面详细解释其工作原理:

一、vcpkg 如何确定库版本

  1. 版本控制机制 vcpkg 引入了 版本控制功能(versioning)(2021 年之后引入),支持如下几种方式选择库版本:

    • baseline 版本(基线版本)
    • 版本约束(version>、version=、port-version)
    • 可重复构建(lockfile + manifests)
  2. 默认行为:基于 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 所对应的推荐版本(一般是最新稳定版)。

  3. 没有写版本号仍能工作? 是因为:

    • 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


更多参考: