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

2023-10-31

在高级编程语言中,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。



作者:刘永强

JFrog 中国技术支持负责人,曾在 HPE,亿玛等公司担任高级工程师,专注系统架构、软件CI/CD及devops领域,在互联网平台建设上有着丰富的经验,曾服务的客户有中兴通讯,宜人贷,易保科技,顺丰等等,并负责过多个互联网平台和移动应用的研发和运维工作。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实战C/C++ 的依赖管理工具 – Conan 的相关文章

随机推荐

  • 基于 LowCodeEngine 的低代码组件体系的建设和实践

    今天在这里和大家聊一聊前端组件 或者现在更流行的说法 物料 的话题 物料本身已经不是一个新鲜的话题了 从 06 年 jQuery 发布 前端物料就开始以各种 jQuery 插件的形式不断涌现 直到今天我们仍然可以在 github 上看到很多
  • spring IOC

    1 主要内容 2 Spring 框架 2 1 Spring 框架概念 Spring 是众多开源java项目中的一员 基于分层的javaEE应用一站式轻量级开源框架 主要核心是 IOC 控制反转 依赖注入 与 AOP 面向切面 两大技术 实现
  • BASE64加密解密问题

    BASE64加密解密问题 问题点 base64解密用base64加密的字符串 没有拿到正确的原字符串 1 原支付链接 https yimafu yeepay com ymf pay qrPay index qr 4AZZPEEO id YM
  • 计算机按键模块,计算器键盘-TM1650/AIP650

    使用TM1650 AIP650作为输入检测芯片 TM1650和AIP650在引脚和功能上完全相同 两个芯片都是可以控制4个8段数码管或者扫描4 7矩阵按键 在读取数据的协议上 两种芯片的读取时序略有不同 但在控制命令上 是大致相同的 制作这
  • JAVA JRE JDK

    JRE Java Runtime Environment JVM 核心库 运行JAVA程序 class文件 所必须的组件 如想开发编译Java程序 java文件 需安装JDK Java Development Kit 安装JDK时默认包含公
  • 3.23 vi/vim:纯文本编辑器

    vi vim 是Linux命令行界面下的文字编辑器 几乎所有的Linux系统都安装了vi 只要学会了vi这个编辑工具 就可以在任何Linux系统上使用它 而vim是vi命令的增强版 Vi IMproved 与vi编辑器完全兼容 此外还有很多
  • 远程升级单片机程序怎么设计?

    之前的文章中介绍过串口和U盘的IAP程序设计 在物联网应用中 远程IAP升级MCU的程序是一项非常有用的功能 当设备出现程序问题或者需要更新程序时 只需要在服务器上对设备进行升级 不需要在有专门的人员去现场进行升级 节省人力物力 要实现远程
  • 算法之小试牛刀——回型数组

    回型数组 今天偶然做到了这道稍稍有些难度的算法题 写一个回型数组 具体要求如下 输入一个数字n 要求输出回型数组 例如 输入3 输出 1 2 3 8 9 4 7 6 5 输入4 输出 1 2 3 4 10 11 12 5 9 8 7 6 相
  • J2EE开发环境配置

    目录 1 开发环境介绍 1 1开发工具和环境配置 1 1 2 JDK安装目录文件 1 1 3 bin文件夹下的程序 1 2如何配置环境变量 JAVA HOME JDK的安装目录 path JAVA HOME bin CLASSPATH JA
  • Linux man命令的使用方法

    http www cnblogs com hnrainll archive 2011 09 06 2168604 html Linux提供了丰富的帮助手册 当你需要查看某个命令的参数时不必到处上网查找 只要man一下即可 Linux的man
  • C语言渔夫打鱼晒网问题

    如果一个渔夫从 2011 年 1 月 1 日开始每三天打一次渔 两天晒一次网 编程实现当输入 2011 1 月 1 日以后的任意一天 输出该渔夫是在打渔还是在晒网 include
  • 无法导入同目录的包(解决attempted relative import with no known parent package问题)

    首先 先将父目录设置为根目录 选中文件夹 右键 如若还不行 那就按下面方法导入 假设有这样一个文件夹 father dir son 1 py son 2 py 当在son 2 py中调用son 1 py的 test 类时 调用的方式为 导包
  • Celery基本介绍

    文章目录 Celery架构及介绍 Celery的优点 版本支持情况 使用场景 Celery架构及介绍 项目开发中经常碰到需要使用异步任务的场景 比如一个WEB请求中有运行时间很长的业务运算 如果不采用异步任务 会阻塞当前的web请求 影响用
  • 微信小程序显示二维码

    在请求接口的success下面写入这段代码 在他的上一个请求数据的打他下面创建一个空的用于存放数据的东西比如obj 用于存放数据 将它放到一个一个点击事件中 通过触发点击事件执行代码 如果窒息看代码的话const tupian 这个变量让他
  • 解析rosbag中的.bag文件,得到.jpg图片数据和.pcd点云数据

    目录 一 查看 bag文件中的数据信息 二 解析 bag文件到 jpg文件 三 解析 bag文件到 pcd点云数据文件 参考资料 一 查看 bag文件中的数据信息 rosbag info bag 结果如下所示 二 解析 bag文件到 jpg
  • 解决VsCode下载慢问题

    文章目录 1 VScode下载慢的问题解决 css格式化 要在vscode装 js格式化要装 2 vscode自定义 vue模板 1 VScode下载慢的问题解决 步骤一 打开vscode官网 https code visualstudio
  • linux常用的快捷键

    1 Tab 补充 不用输入完整的命令 输入命令前几个字母后Tab键 会自动补全命令提示 2 移动光标 Ctrl A 移动光标到开头 Ctrl E 移动光标到结尾 Ctrl F 往光标后面移动一个字符 Ctrl B 往光标前面移动一个字符 3
  • HTML+CSS写一个简单的小项目

    HTML CSS写一个小项目 最近在学前端 花了一个月才基本把html和css基本搞清楚 现在在学习js和react方面的有关内容 想着之前学过的前端知识不能丢掉 于是乎萌生出了这样一个想法 那么 不如直接动手操作 于是我打开电脑 操作了起
  • pip 下载慢 pip下载报错 pip加速

    解决方法 更换国内源 阿里云 https mirrors aliyun com pypi simple 豆瓣 http pypi douban com simple 清华大学 推荐 https pypi tuna tsinghua edu
  • 实战C/C++ 的依赖管理工具 – Conan

    在高级编程语言中 C C 广受开发人员的亲睐 在语言排名上也名列前茅 生命力旺盛 而作为一个C C 程序猿 随着开源模块 车轮 的不断创造 你在使用什么工具或方法管理你的依赖和模块化你的开发成果 创造属于你的世界车轮 你还在用 GIT SV