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,下载你的操作系统所需要的版本,安装就可以了
python3,python3,python3----重要的事性说三遍
conan 需要Python3 才能运行,所以不论你是什么平台,请勿必确认你当前python是python3,
命令行窗口输入python --version
确认你的python版本
如果你不需要搭建私有制品库,或使用已经创建的私有制品库,可以跳过本章。
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 CPP-CE 安装包.我用的服务后台为Ubuntu 18.04.5 LTS,以下就以Ubuntu 18.04.5 LTS
为例,说明安装JFrog Artifactory CPP-CE过程
artifactory服务有两种可选择的安装方式:deb/rpm包自动安装(适用于特定的Linux发行版)和tar.gz包安装(适用于所有通用Linux发行版)
下载deb/rpm包安装更加方便,会将解压缩和执行installService.sh安装artifactory.service一步完成:
sudo dpkg -i jfrog-artifactory-cpp-ce-7.33.9.deb
sudo systemctl start artifactory.service
sudo systemctl stop artifactory.service
sudo systemctl status artifactory.service
如果下载tar.gz包,则解压下载的安装包后就完成了安装,Artifactory服务需要手工启动,如果需要以systemctl方式启动服务,执行installService.sh
脚本。
$ tar xvf jfrog-artifactory-cpp-ce-7.33.9-linux.tar.gz
以后台方式启动Artifactory 服务
$ cd artifactory-cpp-ce-7.33.9/app/bin
$ ./artifactoryctl start
$ cd artifactory-cpp-ce-7.33.9/app/bin
$ ./artifactoryctl stop
$ cd artifactory-cpp-ce-7.33.9/app/bin
$./artifactoryctl status
执行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的制品库列表来使用了
执行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
命令创建一个 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
,以及它的源代码,包括构建脚本,这取决于正在创建的包,并构建和执行一个需要包中的库的小应用程序。接下来我们使用当前默认配置(默认配置文件)从源构建包,然后让test_package
文件夹测试包:
$ conan create . demo/testing
...
hello/0.1: Hello World Release!
hello/0.1: _M_X64 defined
...
如果显示“ Hello World Release!” ,表明成功了。
我们现在可以执行conan search
验证二进制包文件是否在conan本地仓库中:
$ conan search
Existing package recipes:
hello/0.1@demo/testing
conan本地仓库保存在$HOME/.conan/data
下,资源管理器器打开文件夹也能看到conan create
生成的数据
如下执行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 及 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将包安装到本地项目或其他指定位置》