背景


具体背景和介绍可以穿越到我们上一篇 C/C++ 依赖原理工具,这里作简单回顾,本篇文章主要进行实战和落地。

 

大部分语言都已经有了专门的依赖解析工具,例如 Maven,Pypi,NPM。我们可以使用 Maven Package 来下载第三方依赖并进行编译构建。


实战C/C++ 的依赖管理工具 – Conan_java


但是 C/C++呢?缺少一个统一的依赖管理的工具,这是 C/C++开发者的一大痛点。


这个问题是由于一些历史原因导致的:


1.     不同的操作系统,不同的编译器和芯片架构

2.     不同的构建系统

3.     不同的获取依赖方法


Conan依赖管理工具优点


通过使用 Conan,我们可以得到以下收益

 

•       统一本地中心仓库(私服),去中心化。

•       统一集成风格与规范,依赖管理变的更简单(跨平台多环境)

•       方便团队共享模块,减少重复车轮,降低工程大小

•       降低不同编译环境依赖的复杂度

•       版本化管理,保证一致性

•       减少人工拷贝等操作带来的风险

•       依赖编译后的文件,加快构建速度


实战 Conan ,进行依赖管理


下面,我们分几个步骤进行 Conan 的实战与落地:

 

1.  安装 Conan 客户端

2.  Conan 全局配置介绍

3.  创建 Demo 项目使用 Conan 依赖进行编译构建

4.  安装 Conan 私服 Artifactory

5.  创建一个新的模块并上传到私服,供其他人员依赖使用

6.  模块开发测试生命周期管理实践

7.  一键进行不同环境编译构建

8.  迁移现有项目到 Conan 项目


Setup 安装


支持以下方式安装:

 Binaries, pip, brew, from source code…

 

我的环境(Mac):

– $ brew install conan

– $ brew install cmake


Conan 全局配置文件


实战C/C++ 的依赖管理工具 – Conan_java_02


  • conan.conf

包含本地包存储路径、日志级别,默认构建参数等全局变量。

  • settings.yml

预定义了 Conan 执行命令时的参数范围,如操作系统,编译器及芯片架构等。


实战C/C++ 的依赖管理工具 – Conan_java_03


  • registry.txt

中心仓库或公司内部私服的服务器地址及用户认证信息。


创建 Demo 项目并使用 Conan 

依赖进行编译构建


项目结构如下:


实战C/C++ 的依赖管理工具 – Conan_java_04


其中 main.cpp 是新开发的项目代码,conanfile.txt 定义依赖哪些第三方模块。


main.cpp


实战C/C++ 的依赖管理工具 – Conan_java_05


其中 include 一个已存在模块,其中包含 hello.h 文件。


conanfile.txt


实战C/C++ 的依赖管理工具 – Conan_java_06


  • Requires 标签描述依赖模块坐标


Hello/0.1@demo/testing 对应 模块名称/版本@user/channel(Channel 用于区分环境或用途)


  • Generators 标签描述对应开发编译工具,会对应生成用于编译构建的文件


指定 CMake 会生成对应 CMake 规范工程文件,包含编译需要的依赖配置,同理 visual_studio。


编译构建


创建并进入 Build 目录,执行 Conan Install 命令,进行依赖下载, -s  可以指定编译的芯片架构,同时生成相应 CMake 标准工程文件,之后可以通过 CMake 进行编译产生二进制可执行文件 Greet。


实战C/C++ 的依赖管理工具 – Conan_java_07


安装 Conan 私服 Artifactory


本次 Demo 使用 Artifactory 作为 Conan 私服。

JFrog Artifactory 已经支持 Conan 仓库,全力加速 C/C++开发。


实战C/C++ 的依赖管理工具 – Conan_java_08


安装引导参考官方文档:https://www.jfrog.com/confluence/

 

另附30天免费试用版申请链接: 

 

https://www.jfrog.com/artifactory/free-trial/?lang=zh-hans#High-Availability


创建一个新模块并上传到私服


使用 Conan New 命令创建一个模块包。


实战C/C++ 的依赖管理工具 – Conan_java_09


该命令会生成 conanfile.py 文件,该文件定义了功能模块的基本描述(坐标),以及模块构建的生命周期,包括:源码、配置、构建、打包等阶段,并由 Python文件定义,可以自行灵活修改。


实战C/C++ 的依赖管理工具 – Conan_java_10


之后可以通过 Conan Install 命令按照生命周期进行编译构建。


构建之后通过 Conan Export  命令导出模块到本地仓库,可以在本地为其他项目提供依赖,类似 Mvn Install。


实战C/C++ 的依赖管理工具 – Conan_java_11


同时我们可以上传到公司私服,对外提供依赖服务,使用 Conan Upload 命令将模块上传到私服,-r 参数可以指定具体私服。


实战C/C++ 的依赖管理工具 – Conan_java_12


上传到私服效果展示:


实战C/C++ 的依赖管理工具 – Conan_java_13


模块开发测试生命周期管理实践


软件开发都会有其对应的生命周期,开发,测试,生产,Conan 同时对此做了相应支持,不难发现,上文中在模块的坐标定义中已有相应说明,Hello/0.1@user/testing. 其中 Testing 描述了软件生命周期中对应的阶段。


当我们测试通过之后,我们可以通过命令或 API 将包快速升级到生产阶段,避免多次构建。


实战C/C++ 的依赖管理工具 – Conan_java_14


一键进行不同环境编译构建


C/C++ 日常开发中会遇到需要在不同架构 ,不同编译器版本上进行测试,工作量不小,在 Conan 官网和社区,也提供了很多提高效率的工具:

•    Pip install conan-package-tools

•    Travis-ci (Linux, OSX), with docker

•    Appveyor (Win)

通过借助 Docker 构建不同架构或不同编译器版本(gcc 4.6,4.8,5.2,5.3 etc)的二进制包,进行测试或发布, 可以帮助我们实现一键编译,大大提高工作效率。


迁移现有项目到 Conan 项目


有了强大的依赖管理工具,就需要考虑迁移我们现有项目到 Conan 上来,原则上迁移可以选择一个项目团队先进行试点。上文中创建一个新的模块中提到构建生命周期,我们可以为迁移项目创建相应的 conanfile.py,  并根据公司情况自定义各个阶段的执行过程,成熟形成一定规范之后进行大规模迁移。


总结


Conan 为我们提供了统一的依赖管理和构建规范,通过统一 Conanfile 来描述依赖模块的坐标,并支持主流构建编译工具,CMake,Visual Studio xcode等。同时 Conan 也支持其他类型语言的依赖管理,例如现在很火的 Golang。