背景
具体背景和介绍可以穿越到我们上一篇 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。