conan 安装

Conan是一个面向 C 和 C++ 开发人员的软件包管理器。

Conan是通用且便携的。它适用于所有操作系统,包括 Windows、Linux、OSX、FreeBSD、Solaris 等,并且可以针对任何平台,包括桌面、服务器以及嵌入式和裸机设备的交叉构建。它与 Docker、MinGW、WSL 等其他工具以及 CMake、MSBuild、Makefiles、Meson、SCons 等所有构建系统集成。它甚至可以与任何专有的构建系统集成。

Conan 是完全免费和开源的,并且完全去中心化。它与 JFrog Artifactory 原生集成(包括免费的Conan Artifactory 社区版),使开发人员能够在自己的服务器上托管自己的私有包。ConanCenter中央存储库包含数百个流行的开源库包,其中包含许多用于主流编译器版本的预编译二进制文件。

Conan 可以为不同的构建配置管理任意数量的不同二进制文件,包括不同的架构、编译器、编译器版本、运行时、C++ 标准库等。当二进制文件不适用于一种配置时,它们可以根据需要从源构建。Conan 可以在每个平台上使用相同的命令和流程创建、上传和下载二进制文件,从而节省大量开发和持续集成时间。二进制兼容性甚至可以在每个包的基础上进行配置和定制。

conan 为Client/Server架构,前端只有一个conan程序用于与后台服务交互,后端为JFrog Artifactory.

打conan下载页面 https://conan.io/downloads.html就可以找到你需要的Client和Servert程序:

在这里插入图片描述

conan (Client)

conan 提供了各种操作系统平台的Client,下载你的操作系统所需要的版本,安装就可以了
在这里插入图片描述

python3

python3,python3,python3----重要的事性说三遍
conan 需要Python3 才能运行,所以不论你是什么平台,请勿必确认你当前python是python3,
在这里插入图片描述
命令行窗口输入python --version确认你的python版本
在这里插入图片描述

JFrog Artifactory

如果你不需要搭建私有制品库,或使用已经创建的私有制品库,可以跳过本章。

Artifactory 直译即为制品工厂(artifact factory ).

JFrog Artifactory是conan的后台服务.

JFrog Artifactory是通用制品管理系统(与Sonatype是同类产品),不仅支持conan,还支持支持所有包类型(maven,gladle,npm,go,rpm,deb,docker,nuget…) ,全部开发语言

connan官网提供的后端程序 JFrog Artifactory 准确说是免费的JFrog Artifactory 社区版 (JFrog Artifactory Community Edition For C/C++),只用于conan前端管理C/C++的制品。

原本为了省事打算试用 JFrog Artifactory的云端版本,这样就不需要安装服务端了,可是在申请云端版本试用过程中报了错,无法进行下去,所以我只能安装本地版本。

下载JFrog Artifactory安装包

你可以根据自己的服务端系统平台下载需要的JFrog Artifactory CPP-CE 安装包.我用的服务后台为Ubuntu 18.04.5 LTS,以下就以Ubuntu 18.04.5 LTS为例,说明安装JFrog Artifactory CPP-CE过程

所有Linux安装包都不适用于Arm64服务器
在这里插入图片描述

安装JFrog Artifactory

artifactory服务有两种可选择的安装方式:deb/rpm包自动安装(适用于特定的Linux发行版)和tar.gz包安装(适用于所有通用Linux发行版)

deb/rpm包安装

下载deb/rpm包安装更加方便,会将解压缩和执行installService.sh安装artifactory.service一步完成:

sudo dpkg -i jfrog-artifactory-cpp-ce-7.33.9.deb
  • 启动Artifactory 服务
sudo systemctl start artifactory.service
  • 停止Artifactory 服务
sudo systemctl stop artifactory.service
  • 查看Artifactory 服务状态
sudo systemctl status artifactory.service
tar.gz包安装

如果下载tar.gz包,则解压下载的安装包后就完成了安装,Artifactory服务需要手工启动,如果需要以systemctl方式启动服务,执行installService.sh脚本。

$ tar xvf jfrog-artifactory-cpp-ce-7.33.9-linux.tar.gz
  • 启动Artifactory 服务

以后台方式启动Artifactory 服务

$ cd artifactory-cpp-ce-7.33.9/app/bin
$ ./artifactoryctl start
  • 停止Artifactory 服务
$ cd artifactory-cpp-ce-7.33.9/app/bin
$ ./artifactoryctl stop
  • 查看Artifactory 服务状态
$ cd artifactory-cpp-ce-7.33.9/app/bin
$./artifactoryctl status
  • 安装systemctl 服务

执行installService.sh安装artifactory.service

$ sudo ./installService.sh

然后执行systemctl启动服务命令:

$ sudo systemctl daemon-reload
$ sudo systemctl start artifactory.service

防火墙

artifactory服务默认的对外服务端口是8081,8082,需要在防火墙开启端口,以ufw防火为例:

sudo ufw allow 8081
sudo ufw allow 8082

第一次登录

这里输入JFrog Artifactory的web服务入口地址 http://127.0.0.1:8081(请将127.0.0.1改为你的服务IP或域名),准备第一次登录

当服务已经启动但还未准备好时,打开入口会显示如下动图:
在这里插入图片描述

初始的管理帐户和密码为:admim/password

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第一次成功登录后根据提示,创建制品仓库(Repository),创建用户,创建用户组等等,所有步骤完成。一个JFrog Artifactory conan制品仓库就算初始化完成啦。后续的工作就是在前端使用conan来发布,上传制品的工作了。

conan 连接JFrog Artifactory

在本文开始就已经安装了conan,现在私有的JFrog Artifactory制品库已经安装就绪,就可以将这制品库添加到conan的制品库列表来使用了

添加私有仓库

执行conan remote list看一下都有那些远程仓库(制品库),显示conan默认的制品库列表只有一个conan自己维护的中央仓库conancenter

$ conan remote list
conancenter: https://center.conan.io [Verify SSL: True]

conancenter(https://center.conan.io)保存了大部分知名的,常用的开源库,般的linux,windows开发都可以直接引用,这个后续再展开讲

将私有制品库添加到conan远程仓库列表中,命名为privrepo

conan remote add privrepo http://127.0.0.1:8082/artifactory/api/conan/${repo}
# add a remote repository as 'privrepo'
# ${repo}为前面创建的制品仓库的名字-'stable'

如果添加错了,可以删除之后再重新添加

conan remote remove privrepo
# remove remote repository named 'privrepo'

添加私有制品库后再执行conan remote list,就可以在列表中看到已经添加的privrepo仓库

$ conan remote list
conancenter: https://center.conan.io [Verify SSL: True]
privrepo: http://127.0.0.1:8082/artifactory/api/conan/${repo} [Verify SSL: True]

设置登录用户和密码

为私有制品库privrepo指定访问的用户名和密码,以支持后续免密上传操作

conan user -p $your_password -r privrepo $your_username
# set connect username/password for remote repository named 'privrepo'

执行conan user不加任何参数显示所有仓库对应的登录用户名

$ conan user
Current user of remote 'conancenter' set to: 'None' (anonymous)
Current user of remote 'privrepo' set to: '${your_username}' [Authenticated]
# ${your_username}设置的登录用户名

第一次上传

以下是根据conan官方文档《Getting started》整理的上传示例

conan new

首先使用conan new 命令创建一个 Hello World C++ 库示例工程:

$ mkdir hellopkg && cd hellopkg
$ conan new hello/0.1 --template=cmake_lib
File saved: conanfile.py
File saved: CMakeLists.txt
File saved: src/hello.cpp
File saved: src/hello.h
File saved: test_package/conanfile.py
File saved: test_package/CMakeLists.txt
File saved: test_package/src/example.cpp

hello/0.1是 conan的一个官方示例项目,执行上面的conan new命令后会生成如下文件:

  • conanfile.py:在根文件夹中有一个conanfile.py,它是主要的配置文件,负责定义包的构建和使用方式。

  • CMakeLists.txt:一个简单的通用CMakeLists.txt,其中没有关于conan的任何具体内容。

  • src文件夹:包含简单 C++ “hello”库的src文件夹。

  • (可选)test_package文件夹:包含一个示例应用程序,该应用程序将需要并与创建的包链接。这不是强制性的,但检查我们的包是否正确创建很有用。
    文件夹的内容test_package现在对于理解包是如何创建的并不重要,重要的是:

  • test_package文件夹不同于单元测试或集成测试。这些测试是“包”测试,并验证包是否正确创建,以及包使用者将能够链接它并重用它。

    • 它本身是一个小型的柯南项目,它包含自己的conanfile.py,以及它的源代码,包括构建脚本,这取决于正在创建的包,并构建和执行一个需要包中的库的小应用程序。
    • 它不属于包。它仅存在于源存储库中,而不存在于包中。

conan create

接下来我们使用当前默认配置(默认配置文件)从源构建包,然后让test_package文件夹测试包:

$ conan create . demo/testing
...
hello/0.1: Hello World Release!
  hello/0.1: _M_X64 defined
  ...

如果显示“ Hello World Release!” ,表明成功了。
在这里插入图片描述

conan search

我们现在可以执行conan search验证二进制包文件是否在conan本地仓库中:

$ conan search
Existing package recipes:

hello/0.1@demo/testing

conan本地仓库保存在$HOME/.conan/data下,资源管理器器打开文件夹也能看到conan create生成的数据
在这里插入图片描述

conan upload

如下执行conan upload 命令上传hello/0.1到远程私有制品仓库privrepo

$ conan upload hello/0.1@demo/testing --all -r=privrepo
Uploading to remote 'privrepo':
Uploading hello/0.1@demo/testing to remote 'privrepo'                            
Compressing recipe sources...
Uploading conan_sources.tgz -> hello/0.1@demo/testing
Uploading conanfile.py -> hello/0.1@demo/testing
Uploading conanmanifest.txt -> hello/0.1@demo/testing
Uploaded conan recipe 'hello/0.1@demo/testing' to 'privrepo': http://127.0.0.1:8082/artifactory/api/conan/stable
Uploading package 1/1: 63da998e3642b50bee33f4449826b2d623661505 to 'facelib'    
Compressing package...
Uploading conan_package.tgz -> hello/0.1@demo/testing:63da
Uploading conaninfo.txt -> hello/0.1@demo/testing:63da
Uploading conanmanifest.txt -> hello/0.1@demo/testing:63da

上传成功在JFrog Artifactory后台制品仓库(stable)就可以上传的包:
在这里插入图片描述

参考资料

《conan的安装、使用、创建包、上传包等一系列操作》

《Getting started》

《Uploading Packages to Remotes》

conan系列文章

《conan入门(一):conan 及 JFrog Artifactory 安装》
《conan入门(二):conan 服务配置-密码管理及策略》
《conan入门(三):上传预编译的库(artifact)》
《conan入门(四):conan 引用第三方库示例》
《conan入门(五):conan 交叉编译引用第三方库示例》
《conan入门(六):conanfile.txt conanfile.py的区别》
《conan入门(七):将自己的项目生成conan包》
《conan入门(八):交叉编译自己的conan包项目》
《conan入门(九):NDK交叉编译自己的conan包项目塈profile的定义》
《conan入门(十):Windows下Android NDK交叉编译Boost》
《conan入门(十一):Linux下Android NDK交叉编译Boost》
《conan入门(十二):Windows NDK 编译 boost报错:CMake was unable to find a build program … MinGW Makefile》
《conan入门(十三):conan info 命令的基本用法》
《conan入门(十四):conan new 命令的新特性–模板功能(–template)》
《conan入门(十五):AttributeError: ‘CMake‘ object has no attribute ‘definitions‘》
《conan入门(十六):profile template功能实现不同平台下profile的统一》
《conan入门(十七):支持android NDK (armv7,armv8,x86,x86_64)交叉编译的统一profile jinja2模板》
《conan入门(十八):Cannot recognize the Windows subsystem, install MSYS2/cygwin or specify a build_require》
《conan入门(十九):封装第三方开源库cpp_redis示例》
《conan入门(二十):封装只包含头文件(header_only)的库示例》
《conan入门(二十一):解决MinGW编译Openssl的编译错误:crypto/dso/dso_win32.c》
《conan入门(二十二):编译 openssl要求python 3.7以上版本》
《conan入门(二十三):Windows下MinGW编译libcurl》
《conan入门(二十四):通过CONAN_DISABLE_CHECK_COMPILER禁用编译器检查》
《conan入门(二十五):imports将包安装到本地项目或其他指定位置》
《conan入门(二十六):使用make编译makefile》
《conan入门(二十七):因profile [env]字段废弃导致的boost/1.81.0 在aarch64-linux-gnu下交叉编译失败》
《conan入门(二十八):解决conan 1.60.0下 arch64-linux-gnu交叉编译openssl/3.1.2报错问题》
《conan入门(二十九):对阿里mnn进行Conan封装塈conans.CMake和conan.tools.cmake.CMake的区别》
《conan入门(三十):对腾讯ncnn进行Conan封装》
《conan入门(三十一):在命令行(shell)中从profile中读取配置参数》
《conan 入门(三十二):package_info中配置禁用CMakeDeps生成使用项目自己生成的config.cmake》
《conan 入门(三十三):requirements()指定header的可见性(transitive_headers)》
《conan 入门(三十四):conan 2.x实现对只有Makefile的项目(erpcgen)的封装示例》
《conan 入门(三十五):在conanfile.py中获取C++编译器完整路径的方法》
《conan入门(三十六):在set_version方法中从pom.xml中读取版本号实现动态版本定义》
《conan 入门(三十七):conan 2.x通过定义环境变量(environment)执行make编译只有Makefile的项目(erpcgen)》
《conan 入门(三十八):conan二进制包的兼容性及自定义package_id的方式》
《conan入门(三十九):conan 2.x 引用第三方库示例》

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐