实战C/C++的依赖管理工具--Conan

在高级编程语言中,C/C++ 广受开发人员的亲睐,在语言排名上也名列前茅,生命力旺盛,而作为一个C/C++ 程序猿,随着开源模块(车轮)的不断创造,你在使用什么工具或方法管理你的依赖和模块化你的开发成果,创造属于你的世界车轮,你还在用 GIT/SVN 管理 C/C++ 的依赖吗?目前已经有爱立信等国际大公司大规模使用 Conan 做C++的包依赖的管理。今天跟大家一起实战 Conan 进行 C/C++ 依赖管理。

 

背景

 

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

 

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

 

 

但是 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 全局配置文件

 

 

  • conan.conf

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

  • settings.yml

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

 

 

  • registry.txt

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

 

创建 Demo 项目并使用 Conan 

依赖进行编译构建

 

项目结构如下:

 

 

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

 

main.cpp

 

 

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

 

conanfile.txt

 

 

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

 

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

 

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

 

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

 

编译构建

 

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

 

 

安装 Conan 私服 Artifactory

 

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

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

 

 

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

 

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

 

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

 

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

 

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

 

 

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

 

 

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

 

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

 

 

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

 

 

上传到私服效果展示:

 

 

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

 

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

 

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

 

 

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

 

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。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章