C语言■Github架构师解读Cu002FC++应用包管理的Why和How( 二 )


C语言■Github架构师解读Cu002FC++应用包管理的Why和How
本文插图

通过引入包管理系统 , 可以为C/C++包的每一个版本预编译好多个与之对应的面向不同目标环境的二进制包 , 再通过语义化版本及兼容环境的描述 , 在构建过程中直接获取对应的二进制包 , 从而能够大大节省构建的时间 , 保证DevOps流水线的一致性和可重复性 。 同时 , 当发现某些问题 , 如安全漏洞或开源许可证错误时 , 也可以通过对依赖关系的管理 , 迅速定位问题的影响范围 , 提升问题的解决效率 。
C语言■Github架构师解读Cu002FC++应用包管理的Why和How
本文插图

对于C/C++开发常用的子模块的方式 , 并不能满足上述DevOps的要求 。 子模块的方式不能解决构建时间长的问题 , 不能保证所依赖的库的不可变性 , 对版本的依赖关系缺乏灵活的定义和管理 , 对兼容性的分析和处理也缺乏内置的解决方案 。
C语言■Github架构师解读Cu002FC++应用包管理的Why和How
本文插图

类似的 , 通过Git LFS来管理C/C++的包也不是一个好的方式 。 Git LFS缺乏对版本依赖关系的灵活定义和管理 , 缺乏对兼容性分析和处理的内置解决方案 , 同样不能解决构建时间长的问题 。
因此 , 要提升C/C++应用的DevOps效率和质量 , 我们需要引入与Java、JavaScript等类似的包管理解决方案 。 而目前这一领域发展最快、最受业界关注的就是Conan 。
三、Conan——C/C++的包管理方案 Conan(https://conan.io)是一个开源的解决方案 , 为C/C++应用提供了跨平台的包管理方式 。 而JFrog收购Conan后 , 通过结合其在制品管理方面产品和技术的优势 , 更提升了Conan对C/C++应用的支持能力 。
C语言■Github架构师解读Cu002FC++应用包管理的Why和How
本文插图

Conan具有良好的兼容性 , 能够与当前C/C++领域应用的各种构建系统和编译器配合使用 。
C语言■Github架构师解读Cu002FC++应用包管理的Why和How
本文插图

Conan提供了完整的C/C++应用依赖关系管理能力 , 能够支持语义化版本描述、传递依赖的解析、依赖冲突的分析与解决 , 以及灵活的范围化版本描述等 。
C语言■Github架构师解读Cu002FC++应用包管理的Why和How
本文插图

Conan还为C/C++应用的DevOps建设提供了丰富的工具支持:

  • 针对包仓库 , 提供了原生、开源的Conan Server , 同时JFrog的Artifactory、Bintray也提供了功能更为丰富、全面的商业化产品支持;
  • Conan的客户端 , 与各种构建系统对接 , 实现基于Conan的C/C++构建;
Conan提供与Jenkins、Travis CI等工具的对接 , 实现C/C++应用自动化的、可重复的DevOps流水线 。
C语言■Github架构师解读Cu002FC++应用包管理的Why和How
本文插图

在Conan的解决方案中 , 包的每一个版本都根据目标环境的不同 , 如架构、操作系统、编译器等 , 预编译好与之对应的二进制包 。 构建时 , Conan客户端只下载与当前目标环境兼容的二进制包 , 从而在保证一致性的同时 , 提升了构建的效率 。
对于特殊环境 , 还没有对应的预编译二进制包的情况 , Conan通过定义包的Recipe , 描述了如何构建该包的二进制包的过程 , Conan客户端可以即时构建出一个新的 , 匹配与当前特殊环境的新二进制包 , 供应用构建使用 。 同时 , 这个新二进制包也可以存回包仓库当中 , 供后续的构建直接引用 。
C语言■Github架构师解读Cu002FC++应用包管理的Why和How


推荐阅读