vcpkg更新: C/C++代码管理利器

vcpkg更新: C/C++代码管理利器

作者:HQ |  时间:2019-08-27 |  浏览:146 |  评论已关闭 条评论

近日,VS团队小姐姐Tara官宣了C/C++代码管理利器vcpkg的2019.07版本更新。就在上个月,我在一篇文章中给大家介绍了vcpkg的2019.06更新汇总。时隔一个月的今天,2019.07版本就新鲜出炉了,感觉这速度还是挺快的,为团队老哥们点个赞。

让我们来看看这次带了什么新东西
在这篇文章中,我会主要介绍代码构建缓存,port和triplet更新,port贡献者的改进,以及相关帮助文档的更新。
如果想查看完整的更新列表,请大家移步Github。

使用vcpkg进行构建缓存
在构建大型项目中,由于引入了众多的代码库,所以构建时间会比较久。这次的vcpkg更新特别添加了构建的缓存功能,具体来说,就是在Azure Pipelines中,通过重用之前的构建缓存,可以大大减少工程的构建时间。这个特性,在构建大型工程的场景下特别有用,因为通过缓存之前的文件,可以避免在每次工程构建中重新编译那些相同的依赖库,从而加速整个工程的构建进度。
说白了,你编译工程的时间变短了,你就有更多的时间用来开发核心业务功能,当然,如果你每次在编译的时间出去喝杯咖啡的话,那就尴尬了!

举个栗子。如果你的C++项目中使用到了广泛使用的SQLite数据库,当然,你也可能在其他库中也使用到了SQLite。当不启用pipeline缓存机制时,每次跑构建的时候都会安装vcpkg和sqlite3库,这样就比较话费时间了。

当启用缓存,就可以避免这些重复构建和安装操作,从而大大加快构建进程,是不是美滋滋?

另外,微软工程师Luca新建了一个pipeline任务,通过使用CachBeta pipeline任务,开发团队做了一个对比测试,发现在”run vcpkg”这个构建阶段,构建所需要的时间由2分钟26秒减少到了14秒,holy shit! 效果是真显著。

Azure DevOps扩展:CppBuildTasks
下图是CppBuildTasks工程pipeline任务流程图:

在上面SQLite3的例子中,根据上面的流程图,vcpkg首先会被安装,然后就是sqlite3库的安装。这些安装都会被缓存在pipeline中,因此后续的构建过程中,将不再需要重新构建和安装了。

关于如何在你的工程中使用CppBuildTasks,请参考Github上的一个简单例子。这里就不赘述了。

下面我们来看看一些值得注意的东西:

> vcpkgGitReg: 这个是一个具体的commit ID,用来指定你希望安装的vcpkg版本。
> task: CacheBeta@0: 这个用来在Azure Pipelines中启用管道缓存。
> key: $(Build.SourcesDirectory)/vcpkg_x64-linux.txt | “$(vcpkgGitRef)” | “$(Agent.Name)”: 这个是一个key,它使用包含了库和响应文件(这个响应文件包含一个包的列表)的源目录,提交ID以及构建代理名称来生成一个构建哈希值。

使用缓存机制后的结果
好了,让我们来看看,借助于CppBuildTasks脚本,我们在Ubuntu的服务器上跑了一次vcpkg和sqlite3的构建和安装,可以看到,相比之前,构建时间显著的减少了。

Ports
在这次的更新中,开发团队新加入了37个新的Ports。有人民群众喜闻乐见的:7zip, basisu, librdkafka, mimalloc, mongoose和zookeeper。完整的更新列表请大家移步Github。除了这37个新增Ports,此次还对现有的160个Ports进行了更新和修订。

Triplets
vcpkg默认支持多个构建目标环境(Triplets)。在过去的一个月里,开发团队将Linux上的Ports从823增加到了866个。

下面是所有构建目标环境中的Ports汇总:

Port贡献者的改进
开发团队也对vcpkg基础设施进行了优化,包括引入了一个新的vcpkg环境变量和一种新的修改vcpkg triplet环境变量的机制。这些改进目前还在不断优化中,请大家拭目以待。

新的Triplet环境变量:VCPKG_ENV_PASSTHROUGH
在此之前,在Windows上只能通过在allow list中手动添加,这次新增了一个VCPKG_ENV_PASSTHROUGH变量,用来手动覆盖之前在文件中的设定。

环境变量覆写
Port的作者可以新加入一个environment-overrides.cmake文件到Port中,用来覆写或重新设定vcpkg的triplet变量。举个栗子:这个特性可以使原本在vcpkg source中不允许被显示的环境变量在PortFile中重新变得可用。

文档的更新
当然,每次的特性更新,都是少不了文档。谁叫你是微软呢?
以上所有的更新要点都在文档中有清晰的说明,如果大家有什么疑问,可以先去文档里搜索一下。

总结
总的来说,vcpkg作为一个后起之秀的包管理器,目前处于极速开发期,也可能会有各种各样的小毛病,但我们相信,通过开发团队辛勤工作,它一定会是各位C/C++开发者工具包里的一把利器。
那,为什么不试试呢?

标签:

评论已关闭。