随心所欲地对vcpkg依赖进行版本控制

特别鸣谢
感谢VictorRomero对本文内容的贡献 。
今天 , 我们高兴地宣布vcpkg的一项新特性:包版本控制 。 开发者等待这项新特性已经很久了 , 今天它终于来了 。 这项特性可以实现软件包特定依赖版本的安装 , 同时控制现有已安装的版本 。 为了使用这项新特性 , 你需要在你的仓库里创建一个vcpkg.json的清单文件 , 用来声明各个程序包的依赖关系 。 请注意 , 在命令行模式下安装的程序库还暂未支持版本控制(例如 , 使用vcpkginstalllibrary_name) 。 版本控制特性是完全可选的 , 也就是说 , 你可以选择不指定程序库的版本 , 这样的话 , vcpkg将会替你从基线目录中选择最为合适的兼容版本 。
目前 , 这项特性还是实验性质的 , 那大家就试试看呗 , 体验体验也好 。
关于新特性:程序包版本控制
在过去的一年 , 我们一直致力于实现开发者希望的新特性 , 以使vcpkg可以广泛地使用在各种工作场景 。 清单(manifests)和二进制文件缓存(binarycaching)就是其中的2项新特性 , 我们已经在之前的文章中有专门介绍过它们 , 从那时开始 , 开发者就已经在他们的项目中用上它们了 。 今天 , 我们再次官宣一项群众呼声高的新特性:程序包版本控制 。 有了这一新特性 , 开发者就可以做如下的事情:
>在依赖项上声明最小版本约束 。
>冻结指定版本的依赖项 。
>通过使用基线方便地更新所有已声明的依赖项 。
>获取独立于当前vcpkg的ports注册表状态的可重现构建版本 。
让我们开始吧
首先 , 你需要在环境变量中打开”versions”特性标志 。 有如下几种方法:
>如果是在Windows10中 , 可以通过设置VCPKG_FEATURE_FLAGS环境变量 , 如下图所示:

随心所欲地对vcpkg依赖进行版本控制
文章图片
>通过在命令行(例如 , PowerShell)中设置VCPKG_FEATURE_FLAGS变量:$env:VCPKG_FEATURE_FLAGS=”versions”vcpkginstall
>通过在命令行(例如 , PowerShell)中向vcpkg传入新特性标志:vcpkg–feature-flags=”versions”install
在下面的例子中 , 我们将会使用到VisualStudioCode来创建一个简单的CMake工程 , 它会自动读取vcpkg的清单文件并安装其需要的依赖包 。 在VisualStudio中 , 你也可以这样做 。 如果需要了解有关如何在VisualStudio中使用vcpkg和清单的更多信息 , 请查看我们之前的一篇讲解vcpkg的介绍性文章 。
第一个例子:简单的版本控制
如下图所示 , 通过在vcpkg.json中编写如下语句以创建一个文件夹:

随心所欲地对vcpkg依赖进行版本控制
文章图片
当你使用清单文件的时候 , vcpkg有一个新的版本声明的属性可用 。 在之前的版本中 , 你只能使用属性”version-string”为你的项目声明版本 。 现在 , 版本控制的方法变了 , vcpkg可以感知到新的版本控制结构 , 如下图所示:

随心所欲地对vcpkg依赖进行版本控制
文章图片
首先 , 被选中的版本结构可以影响vcpkg的程序包查找的顺序规则 。 其次 , 我们使用属性”version>=”来声明最小版本约束 。 请注意 , 我们还使用不带特定版本约束的声明添加了一项对zlib的依赖 。 最后 , 我们声明了”builtin-baseline” , 它的值是vcpkg仓库的一项代码提交的SHA哈希值 。
在上面的例子中 , vcpkg将会查找”b60f003ccf5fe8613d029f49f835c8929a66eb61″对应的提交版本 , 然后会找到最新的fmt版本以及当时的zlib版本 , 如下:>fmt7.1.3>zlib1.2.11#9(这里的#9后缀表明这个是程序库的第9个构建版本)
上面列出来的程序包集合被定义在工程依赖的基线版本中 。 当需要解决程序包版本冲突的时候 , 基线版本添加了最小版本约束信息 。
下面是一个简单的源文件 , 它演示了如何测试依赖项是否安装:

随心所欲地对vcpkg依赖进行版本控制
文章图片
为了在一个CMake工程中使用vcpkg清单文件 , 需要在CMakeLists.txt文件中添加find_package和target_link_libraries这两个函数来定位所有的依赖项 。 不管是否使用像vcpkg那样的程序包管理器 , 都可以使用这两个函数 , 这样就可以在工程的构建中包含所需要的依赖项 。

随心所欲地对vcpkg依赖进行版本控制
文章图片
如果你使用的是VisualStudioCode , 则下面的配置演示了如何将一个CMake工程指向一个vcpkgCMake工具链文件 。 对于使用vcpkg的任何CMake工程 , 这个文件必须被设置 。 另外 , 其他的集成开发环境或者编辑器可能有不同的方式来配置CMake工具链文件 。