精华内容
下载资源
问答
  • Conan的私有包管理

    2021-07-12 10:26:10
    刚刚了解Conan,想了解Conan的流程 1.如果Conan中心没有我需要的方法,我自己写的怎么上传到私人包管理服务器里面 2.不借用JFrog,怎么形成自己私有的Conan管理
  • Conan C++ 包管理

    2020-11-29 16:33:41
    Conan是一个分散的包管理器,具有客户端 - 服务器架构。这意味着客户端可以从不同的服务器(“远程”)获取软件包以及上传软件包,类似于git远程控制器的“git”推拉模型。 在较高的层面上,服务器只是包存储。他们...

    conan

    Getting started

    背景介绍

    Conan是一个分散的包管理器,具有客户端 - 服务器架构。这意味着客户端可以从不同的服务器(“远程”)获取软件包以及上传软件包,类似于git远程控制器的“git”推拉模型。

    在较高的层面上,服务器只是包存储。他们不构建也不创建包。这些包由客户端创建,如果二进制文件是从源构建的,则该编译也由客户端应用程序完成。
    在这里插入图片描述
    JFrog Artifactory

    • JFrog Artifactory提供柯南存储库; 所以它也可以用作本地服务器。它是一个功能更强大的解决方案,具有WebUI,多种身份验证协议,高可用性等。它还具有云产品,允许您拥有私有包而无需任何本地基础结构。

    JFrog Bintray

    • JFrog Bintray为OSS Conan软件包提供公共和免费托管服务。用户可以在他们的帐户和组织下创建自己的存储库,并在那里免费上传Conan包,无需审核。但是,您应该考虑到这些软件包是公开的,因此它们必须符合相应的许可证,特别是如果软件包包含第三方代码。只是从Bintray阅读或检索柯南包,不需要帐户,只需要一个帐户来上传包。除此之外,Bintray还提供了一个名为conan -center的中央存储库,该存储库经过审核,并且在被接受之前会对包进行审核以确保质量。

    柯南最强大的功能之一是它可以管理包的预编译二进制文件。要定义由其名称,版本,用户和通道引用的包,需要包装配方。这样的包配方是一个conanfile.py python脚本,它定义了如何从源构建包,最终的二进制工件是什么,包依赖性等。
    在这里插入图片描述

    当在Conan客户端中使用包装配方,并且从源构建“二进制包”时,该二进制包将与特定设置兼容,例如为其创建的OS,编译器和编译器版本或计算机。建筑。如果从相同的源再次构建包但具有不同的设置(例如,对于不同的体系结构),将生成新的不同二进制文件。顺便说一下,“二进制包”是引号,因为严格来说,它不一定是二进制。例如,仅标头库将仅包含“二进制包”中的标头。

    从包装配方生成的所有二进制包都是相干地管理和存储的。将它们上传到遥控器后,它们会保持连接状态。此外,不同的客户端从相同的软件包配方构建二进制文件(如不同操作系统中的CI构建从属服务器),将在同一软件包名称下将其二进制文件上载到远程服务器。

    包消费者(安装现有包以在其项目中重用的客户端应用程序用户)通常将检索其系统的预编译二进制文件,以防存在这样的兼容二进制文件。否则,将从客户端计算机上的源构建这些包以创建与其设置匹配的二进制包。

    conan 安装

     pip install conan
    
       
    • 1

    如果安装有问题可以参考官网文档解决(https://docs.conan.io/en/latest/installation.html)。

    简单实用例子(如何安装conan的依赖)

    官方网站提供了一个简单例子。这里梳理下流程(https://docs.conan.io/en/latest/getting_started.html)。

    我们建立一个简单的项目,项目需要引用md5库。md5库我们通过conan进行下载安装。

    官网提供示例项目程序:

    git clone https://github.com/conan-community/poco-md5-example.git
    
       
    • 1

    git clone下载示例项目。md5.cpp代码如下:

     #include "Poco/MD5Engine.h"
     #include "Poco/DigestStream.h"
    

    #include <iostream>

    int main(int argc, char** argv)
    {
    Poco::MD5Engine md5;
    Poco::DigestOutputStream ds(md5);
    ds << “abcdefghijklmnopqrstuvwxyz”;
    ds.close();
    std::cout << Poco::DigestEngine::digestToHex(md5.digest()) << std::endl;
    return 0;
    }

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    我们下载的项目依赖md5库。我们通过conan下载。

    -- 搜索依赖的库。在conan服务器上。
    conan search Poco* --remote=conan-center
    

    Existing package recipes:

    Poco/1.7.8p3@pocoproject/stable
    Poco/1.7.9@pocoproject/stable
    Poco/1.7.9p1@pocoproject/stable
    Poco/1.7.9p2@pocoproject/stable
    Poco/1.8.0.1@pocoproject/stable
    Poco/1.8.0@pocoproject/stable
    Poco/1.8.1@pocoproject/stable
    Poco/1.9.0@pocoproject/stable

    – 查看库的信息
    conan inspect Poco/1.9.0@pocoproject/stable


    name: Poco
    version: 1.9.0
    url: http://github.com/pocoproject/conan-poco
    license: The Boost Software License 1.0
    author: None
    description: Modern, powerful open source C++ class libraries for building network- and internet-based applications that run on desktop, server, mobile and embedded systems.
    generators: (‘cmake’, ‘txt’)
    exports: None
    exports_sources: (‘CMakeLists.txt’, ‘PocoMacros.cmake’)
    short_paths: False
    apply_env: True
    build_policy: None
    settings: (‘os’, ‘arch’, ‘compiler’, ‘build_type’)
    options:
    enable_apacheconnector: [True, False]
    shared: [True, False]
    default_options:
    enable_apacheconnector: False
    shared: False

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    创建 conanfile.txt (conanfile.txt 可以指出构建系统的要求和编译器)

    可以指定需要那些库。编译需要那个。

     [requires]
     Poco/1.9.0@pocoproject/stable
    

    [generators]
    cmake

    • 1
    • 2
    • 3
    • 4
    • 5

    Poco/1.9.0@pocoproject/stable

    Poco 包的名称,通常与项目/库相同

    1.9.0是通常与打包的项目/库的版本匹配的版本

    这可以是任何字符串; 它不必是数字,因此,例如,它可以指示这是“开发”还是“主”版本。包可以被覆盖,因此也可以定期重新生成“夜间”或“每周”等包。

    pocoproject是此包版本的所有者

    stable是渠道。通道提供了另一种方法,可以为同一个库提供不同的包变体,并可以互换使用它们。它们通常将包的成熟度表示为任意字符串,例如“稳定”或“测试”。

    GCC编译器> = 5.1 会有兼容性问题。具体参考官网。这里不进行说明。

    安装依赖

    mkdir build && cd build
    conan install ..
    ...
    Requirements
        OpenSSL/1.0.2o@conan/stable from 'conan-center' - Downloaded
        Poco/1.9.0@pocoproject/stable from 'conan-center' - Cache
        zlib/1.2.11@conan/stable from 'conan-center' - Downloaded
    Packages
        OpenSSL/1.0.2o@conan/stable:606fdb601e335c2001bdf31d478826b644747077 - Download
        Poco/1.9.0@pocoproject/stable:09378ed7f51185386e9f04b212b79fe2d12d005c - Download
        zlib/1.2.11@conan/stable:6cc50b139b9c3d27b3e9042d5f5372d327b3a9f7 - Download
    

    zlib/1.2.11@conan/stable: Retrieving package 6cc50b139b9c3d27b3e9042d5f5372d327b3a9f7 from remote ‘conan-center’

    Downloading conan_package.tgz
    [] 99.8KB/99.8KB

    zlib/1.2.11@conan/stable: Package installed 6cc50b139b9c3d27b3e9042d5f5372d327b3a9f7
    OpenSSL/1.0.2o@conan/stable: Retrieving package 606fdb601e335c2001bdf31d478826b644747077 from remote ‘conan-center’

    Downloading conan_package.tgz
    [
    ] 5.5MB/5.5MB

    OpenSSL/1.0.2o@conan/stable: Package installed 606fdb601e335c2001bdf31d478826b644747077
    Poco/1.9.0@pocoproject/stable: Retrieving package 09378ed7f51185386e9f04b212b79fe2d12d005c from remote ‘conan-center’

    Downloading conan_package.tgz
    [==================================================] 11.5MB/11.5MB

    Poco/1.9.0@pocoproject/stable: Package installed 09378ed7f51185386e9f04b212b79fe2d12d005c
    PROJECT: Generator cmake created conanbuildinfo.cmake
    PROJECT: Generator txt created conanbuildinfo.txt
    PROJECT: Generated conaninfo.txt

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    在build中会生成 conanbuildinfo.cmake。如果你的项目要引用conan的文件,你需要在你的项目CMakeLists.txt中包含conan生成的conanbuildinfo.cmake文件

    cmake_minimum_required(VERSION 2.8.12)
     project(MD5Encrypter)
    

    add_definitions("-std=c++11")

    include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
    conan_basic_setup()

    add_executable(md5 md5.cpp)
    target_link_libraries(md5 ${CONAN_LIBS})

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    现在我们准备构建并运行我们的Encrypter应用程序

    (win)
    $ cmake .. -G "Visual Studio 15 Win64"
    $ cmake --build . --config Release
    

    (linux, mac)
    $ cmake … -G “Unix Makefiles” -DCMAKE_BUILD_TYPE=Release
    $ cmake --build .

    [100%] Built target md5
    $ ./bin/md5
    c3fcd3d76192e4007dfb496cca67e13b

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    conan安装依赖(扩展)

    你的项目可能使用cmake或者makefile进行构建的。如果你使用conan install libxxx。相关libxxx会下载到conan缓存中(conan 缓存路径下 /home/gpadmin/.conan/ ) 有时候libxxx并没有拷贝到 /usr/local/ 下。如果你想使用必须引用缓存中的路径。但是路径都是绝对路径。随便引用可能出问题。conan文档介绍解决问题几种方法。

    ● cmake

    ● make

    更多编译请参考官网:https://docs.conan.io/en/latest/integrations.html

    cmake 方式

    如果您使用CMake构建项目,你需要创建conanbuildinfo.cmake。在CMakeList.txt中引用这个文件。这个文件可以通过conan install 命令进行创建。在使用这个命令之前你需要创建conanfile.txt 文件指定你的编译器是什么。

    创建conanfile.txt

    ...
    [requires]
    liboss2/master@hashdata/testing
    [generators]
    cmake
    
     
    • 1
    • 2
    • 3
    • 4
    • 5

    conan install 创建 conanbuildinfo.cmake

    conan install .
    
     
    • 1

    创建的conanbuildinfo.cmake 里面定义了你依赖的库信息

    conanbuildinfo.cmake 内容
    ...
    include(CMakeParseArguments)
    set(CONAN_LIBOSS2_ROOT "/home/gpadmin/.conan/data/liboss2/master/hashdata/testing/package/de9c231f84c85def9df09875e1785a1319fa8cb6")
    set(CONAN_INCLUDE_DIRS_LIBOSS2 "/home/gpadmin/.conan/data/liboss2/master/hashdata/testing/package/de9c231f84c85def9df09875e1785a1319fa8cb6/include")
    set(CONAN_LIB_DIRS_LIBOSS2 "/home/gpadmin/.conan/data/liboss2/master/hashdata/testing/package/de9c231f84c85def9df09875e1785a1319fa8cb6/lib")
    set(CONAN_BIN_DIRS_LIBOSS2 )
    set(CONAN_RES_DIRS_LIBOSS2 )
    set(CONAN_BUILD_DIRS_LIBOSS2 "/home/gpadmin/.conan/data/liboss2/master/hashdata/testing/package/de9c231f84c85def9df09875e1785a1319fa8cb6/")
    set(CONAN_LIBS_LIBOSS2 )
    set(CONAN_DEFINES_LIBOSS2 )
    # COMPILE_DEFINITIONS are equal to CONAN_DEFINES without -D, for targets
    set(CONAN_COMPILE_DEFINITIONS_LIBOSS2 )
    ...
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在CMakeList.txt 中引用conanbuildinfo.cmake文件。在CMakeList.txt需要调用conan_basic_setup()宏,这个宏会帮你在CMakeList.txt中声明好你依赖的路径。

    IF(EXISTS ${CMAKE_SOURCE_DIR}/conanbuildinfo.cmake)
    	INCLUDE(${CMAKE_SOURCE_DIR}/conanbuildinfo.cmake)
    	CONAN_BASIC_SETUP()
    ENDIF()
    
     
    • 1
    • 2
    • 3
    • 4

    现在在CMakeList.txt中已经声明了你依赖的库的路径,头文件路径等信息。你需要自己手动去将这些导入到CMakeList.txt里。

    这里我使用的 find_package 方法导入依赖lib。具体find_package用法参考(https://blog.csdn.net/haluoluo211/article/details/80559341)

    conan cmake 依赖官方文档:https://docs.conan.io/en/latest/integrations.html

    make 方式

    跟cmake方法相似。首先你需要创建conanfile.txt 指定你编译器是那个

    conanfile.txt

    [requires]
    liboss2/master@hashdata/testing
    [generators]
     make
    
     
    • 1
    • 2
    • 3
    • 4

    makefile 是通过conanbuildinfo.mak 文件获取依赖信息。执行conan install 创建conanbuildinfo.mak

    conan install .
    
     
    • 1

    生成conanbuildinfo.mak后你需要修改你本地Makefile。conan文档里提供了修改模版

    include conanbuildinfo.mak
    

    #----------------------------------------

    Make variables for a sample App

    #----------------------------------------

    CXX_SRCS =
    main.cpp

    CXX_OBJ_FILES =
    main.o

    EXE_FILENAME =
    main

    #----------------------------------------

    Prepare flags from variables

    #----------------------------------------

    CFLAGS += $(CONAN_CFLAGS)
    CXXFLAGS += $(CONAN_CPPFLAGS)
    CPPFLAGS += $(addprefix -I, $(CONAN_INCLUDE_PATHS))
    CPPFLAGS += $(addprefix -D, $(CONAN_DEFINES))
    LDFLAGS += $(addprefix -L, $(CONAN_LIB_PATHS))
    LDLIBS += $(addprefix -l, $(CONAN_LIBS))

    #----------------------------------------

    Make Commands

    #----------------------------------------

    COMPILE_CXX_COMMAND ?=
    g++ -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@

    CREATE_EXE_COMMAND ?=
    g++ $(CXX_OBJ_FILES)
    $(CXXFLAGS) $(LDFLAGS) $(LDLIBS)
    -o $(EXE_FILENAME)

    #----------------------------------------

    Make Rules

    #----------------------------------------

    .PHONY : exe
    exe : $(EXE_FILENAME)

    $(EXE_FILENAME) : $(CXX_OBJ_FILES)
    $(CREATE_EXE_COMMAND)

    %.o : $(CXX_SRCS)
    $(COMPILE_CXX_COMMAND)

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

    修改好模版。你就可以编译你的项目了。

    conan 关于make文档参考:https://docs.conan.io/en/latest/integrations/make.html

    打包项目

    打包项目过程和原理

    对于包创建者和Conan用户来说,了解在conan本地缓存中创建包的流程以及所有关于其布局的流程非常有用。

    每个包装配方包含本地缓存中的五个重要文件夹:

    • export:存储包装配方的文件夹。
    • export_source:exports_sources存储使用recipe 属性复制的代码的文件夹。
    • source:存储源代码构建源代码的文件夹。
    • build:完成源的实际编译的文件夹。每个不同的二进制配置通常会有一个子文件夹
    • package:存储最终包工件的文件夹。每个不同的二进制配置将有一个子文件夹

    该源和建立文件夹,只有当包已经从源代码构建的存在。
    在这里插入图片描述

    通过conan export命令或更典型地使用conan create命令“导出”包时,该过程开始。该字段指定的conanfile.py和文件 exports_sources将从用户空间复制到本地缓存。

    将export和export_source文件复制到源文件夹,然后source() 执行该方法(如果存在)。请注意,所有二进制包只有一个源文件夹。如果在生成代码时,有不同配置的源代码,则无法使用该source()方法生成,而是需要使用该build()方法生成 。

    然后,对于每个不同的设置和选项配置,将为此配置以SHA-1哈希的形式计算包ID。源将被复制到build / hashXXX文件夹,并将build()触发该方法。

    之后,package()将调用该方法将构件/ hashXXX 文件夹中的工件复制到package / hashXXX文件夹。

    最后,package_info()所有依赖的方法将被调用,聚集这样你就可以产生对消费者构建系统文件,作为conanbuildinfo.cmake的cmake 编译器。此imports功能还会将本地缓存中的工件复制到用户空间(如果已指定)。

    简单打包方法

    让我们为包装配方创建一个文件夹,并使用conan new命令为我们创建一个模版:

    $ mkdir mypkg && cd mypkg
    $ conan new Hello/0.1 -t
    
     
    • 1
    • 2

    会给我们生成以下文件

    conanfile.py
    test_package
      CMakeLists.txt
      conanfile.py
      example.cpp
    
     
    • 1
    • 2
    • 3
    • 4
    • 5

    conanfile.py 中定义了如何打包如何导入源文件。以及项目具体信息。具体conanfile.py里面方法参考:https://docs.conan.io/en/latest/reference/conanfile.html#conanfile-reference

    conanfile.py文件内容:

    from conans import ConanFile, CMake, tools
    

    class HelloConan(ConanFile):
    name = “Hello”
    version = “0.1”
    license = “<Put the package license here>”
    url = “<Package recipe repository url here, for issues about the package>”
    description = “<Description of Hello here>”
    settings = “os”, “compiler”, “build_type”, “arch”
    options = {“shared”: [True, False]}
    default_options = {“shared”: False}
    generators = “cmake”

    def source(self):
        self.run("git clone https://github.com/memsharded/hello.git")
        self.run("cd hello &amp;&amp; git checkout static_shared")
        # This small hack might be useful to guarantee proper /MT /MD linkage
        # in MSVC if the packaged project doesn't have variables to set it
        # properly
        tools.replace_in_file("hello/CMakeLists.txt", "PROJECT(MyHello)",
                              '''PROJECT(MyHello)
    

    include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
    conan_basic_setup()’’’)

    def build(self):
        cmake = CMake(self)
        cmake.configure(source_folder="hello")
        cmake.build()
    
        # Explicit way:
        # self.run('cmake %s/hello %s'
        #          % (self.source_folder, cmake.command_line))
        # self.run("cmake --build . %s" % cmake.build_config)
    
    def package(self):
        self.copy("*.h", dst="include", src="hello")
        self.copy("*hello.lib", dst="lib", keep_path=False)
        self.copy("*.dll", dst="bin", keep_path=False)
        self.copy("*.so", dst="lib", keep_path=False)
        self.copy("*.dylib", dst="lib", keep_path=False)
        self.copy("*.a", dst="lib", keep_path=False)
    
    def package_info(self):
        self.cpp_info.libs = ["hello"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    build 是你要具体如何编译项目

    source source方法表示导入源文件。但是是为git方式来使用的。例子中会去git上下载源文件导入到conan的缓存中

    package 打包你的项目。注意python文件中的 copy 函数,里面的dst是拷贝到conan的package下面。并不能随意的指定路径。

    test_package 文件夹里面是“包”测试,你可以在example.cpp中写测试,并验证包是否正确创建,你可以在里面写一些测试case测试你的包是否好使。

    test_package 具体参考:https://docs.conan.io/en/latest/creating_packages/getting_started.html#creating-the-package-recipe

    执行conan create . demo/testing 创建并打包你的包

    conan create . demo/testing
    
     
    • 1

    在柯南创建命令执行以下操作:

    • 将conanfile.py从用户文件夹复制(以conan术语“导出”)到conan的本地缓存中。
    • 安装包,强制从源构建它。
    • 移动到test_package文件夹并创建临时构建文件夹。
    • 执行conan install …,以安装test_package / conanfile.py的要求 。请注意,它将从源构建“Hello”。
    • 构建并启动示例消费应用程序,分别调用test_package / conanfile.py build()和test()方法。

    使用Conan命令,conan create命令将等效于:

    $ conan export . demo/testing
    $ conan install Hello/0.1@demo/testing --build=Hello
    # package is created now, use test to test it
    $ conan test test_package Hello/0.1@demo/testing
    
     
    • 1
    • 2
    • 3
    • 4

    打包项目(扩展)

    有些项目并不是第三方开发。是自己开发的。这种就不能通过source导入你的项目。可以通过exports_sources 方法将你的源代码导入到conan的缓存中。

    以下是conanfile.py的示例。删除掉source方法。增加exports_sources 表示你的源代码路径。conan在执行conanfile.py时将你的源代码导入到conan的缓存 export_source路径下面。

    from conans import ConanFile, CMake
    

    class HelloConan(ConanFile):
    name = “Hello”
    version = “0.1”
    license = “<Put the package license here>”
    url = “<Package recipe repository url here, for issues about the package>”
    description = “<Description of Hello here>”
    settings = “os”, “compiler”, “build_type”, “arch”
    options = {“shared”: [True, False]}
    default_options = {“shared”: False}
    generators = “cmake”
    exports_sources = “src/*”

    def build(self):
        cmake = CMake(self)
        cmake.configure(source_folder="src")
        cmake.build()
        cmake.install()
    
        # Explicit way:
        # self.run('cmake "%s/src" %s' % (self.source_folder, cmake.command_line))
        # self.run("cmake --build . %s" % cmake.build_config)
    
    def package(self):
        pass
    
    def package_info(self):
        self.cpp_info.libs = ["hello"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 添加了该exports_sources字段,指示柯南将本地src 文件夹中的所有文件复制到包装配方中。

    • 删除了该source()方法,因为不再需要检索外部源。
      同时你需要注意你的CMakeList文件是否引用了相关依赖库,如果引用你需要加入conanbuildinfo.cmake到你的CMakeList文件。
      include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
      conan_basic_setup()

      打包项目-直接打包编译好的项目
      直接打包项目。不从源代码开始进行编译。
      – 创建一个带有conanfile.py的文件
      conan new gdal/1.0@hashdata/testing
      – 直接打包文件到conan package文件夹下 --force 如果已经有了直接覆盖
      conan export-pkg . gdal/1.0@hashdata/testing -pf=/opt/gpsql --force

      参考:https://docs.conan.io/en/latest/creating_packages/existing_binaries.html

    展开全文
  • conan-c++包管理工具安装及使用指南

    千次阅读 2021-04-04 14:42:05
    本篇文章的代码都在这里备份 文章目录一、conan介绍1.1...Conan是C和C ++语言的依赖项和程序包管理器。它是免费和开源的,并且可以在所有平台上使用:Windows,Linux,OSX,FreeBSD,Solaris等,并且可以用于开发所有目

    本篇文章的代码都在这里备份

    一、conan介绍

    1. 跨平台
    2. c、c++包管理工具
    3. python写的
    4. 开源
    5. 类似java的maven,python的pip

    1.1 简单介绍

    • Conan是C和C ++语言的依赖项和程序包管理器。它是免费和开源的,并且可以在所有平台上使用:Windows,Linux,OSX,FreeBSD,Solaris等,并且可以用于开发所有目标,包括嵌入式,移动(iOS,Android)和裸机。它还与所有构建系统集成,例如CMake,Visual Studio(MSBuild),Makefile,SCons等,包括专有系统。

    • 它是专门为加速C和C ++项目的开发和持续集成而设计和优化的。借助完全的二进制管理,它可以在所有平台上使用完全相同的过程为包的任意数量的不同版本创建和重用任意数量的不同二进制文件(用于不同的配置,如体系结构,编译器版本等)。由于它是分散式的,因此很容易运行您自己的服务器以私下托管您自己的软件包和二进制文件,而无需共享它们。建议使用免费的JFrog Artifactory社区版(CE),由Conan服务器在您的控制下私下托管您自己的程序包。


    1.2 conna特点

    • Conan成熟稳定,对向前兼容性(不间断政策)有坚定的承诺,并有一个完整的团队全职致力于其改进和支持。它由一个伟大的社区支持和使用,从ConanCenter中的开源贡献者和包创建者到数千个使用它的团队和公司。

    • Conan是具有客户端-服务器体系结构的分散式软件包管理器。这意味着客户端可以从不同的服务器获取软件包,也可以将软件包上载到不同的服务器(“远程”),类似于“ git”推拉模型到/从git远程服务器。

    • 从较高的角度来看,服务器只是程序包存储。他们不构建也不创建包。这些包是由客户端创建的,并且如果二进制文件是从源代码构建的,则该编译也将由客户端应用程序完成。
      在这里插入图片描述
      上图中的不同应用程序是:

    • Conan客户端:这是一个控制台/终端命令行应用程序,其中包含用于程序包创建和使用的繁琐逻辑。Conan客户端具有用于程序包存储的本地缓存,因此它使您可以完全创建和脱机测试程序包。您也可以脱机工作,只要不需要远程服务器上的新软件包即可。

    • 推荐使用JFrog Artifactory Community Edition(CE),由Conan服务器在您的控制下私下托管您自己的程序包。它是JFrog Artifactory for - Conan软件包的免费社区版本,包括WebUI,多个身份验证协议(LDAP),用于创建高级拓扑的虚拟和远程存储库,Rest API和用于存储任何工件的通用存储库。

    • conan_server是与Conan客户端一起分发的小型服务器。这是一个简单的开源实现,它提供基本功能,但不提供WebUI或其他高级功能。
      ConanCenter是一个中央公共存储库,社区在其中为流行的开源库(例如Boost,Zlib,OpenSSL,Poco等)提供软件包。


    1.3 跨平台

    Conan可在Windows,Linux(Ubuntu,Debian,RedHat,ArchLinux,Raspbian),OSX,FreeBSD和SunOS上运行,并且由于具有可移植性,因此它可在可运行Python的任何其他平台上运行。它可以针对任何现有平台,从裸机到桌面,移动,嵌入式,服务器,跨架构。

    Conan也可以与任何构建系统一起使用。与最流行的集成有内置的集成,例如CMake,Visual Studio(MSBuild),自动工具和Makefile,SCons等。但不需要使用任何集成。甚至没有必要所有软件包都使用相同的构建系统,每个软件包都可以使用自己的构建系统,并依赖于使用不同构建系统的其他软件包。还可以与任何构建系统(包括专有系统)集成。

    同样,柯南可以管理任何编译器和任何版本。有一些最流行的默认定义:gcc,cl.exe,clang,apple-clang,intel,具有不同的版本配置,运行时,C ++标准库等。该模型还可以扩展到任何自定义配置。

    二、conan全平台安装

    无论是在什么平台,因为conan是python开发的。都可以使用python的包管理工具pip下载

    pip install conan
    

    安装后:

    • 命令
    conan --version
    
    • 结果
      在这里插入图片描述

    就可以看到安装的版本。

    更新conan:

     pip install conan --upgrade  
    

    三、使用conan教程

    本篇文章的代码都在这里备份

    让我们从一个示例开始:我们将创建一个MD5哈希计算器应用程序,该应用程序使用最流行的C ++库之一:Poco。

    在这种情况下,我们将使用CMake作为构建系统,但请记住,柯南可与任何构建系统一起使用,而不仅限于使用CMake。

    • 代码段
     #include "Poco/MD5Engine.h"
     #include "Poco/DigestStream.h"
    
     #include <iostream>
    
     int main(int argc, char** argv){
         Poco::MD5Engine md5;
         Poco::DigestOutputStream ds(md5);
         ds << "abcdefghijklmnopqrstuvwxyz";
         ds.close();
         std::cout << Poco::DigestEngine::digestToHex(md5.digest()) << std::endl;
         return 0;
     }
    
    • 依赖项
      我们知道我们的应用程序依赖于Poco库。让我们在ConanCenter遥控器中查找它,转到https://conan.io/center,然后在搜索框中键入“ poco”。我们将看到有一些不同的版本可用。
      或者我们直接使用命令行:
     conan search poco --remote=conan-center
    

    我们可以看到搜索结果截图:

    在这里插入图片描述

    我们可以看到有很多版本的poco库版本

    我对版本1.9.4比较感兴趣,所以我准备查看一下关于这个版本的信息。我输入以下指令,得到反馈。

    • 命令
      conan inspect poco/1.9.4
      
    • 结果截图
      在这里插入图片描述
      看了描述后我决定就用它了,然后我在我的项目里面建立一个名为:conanfile.txt的文件。
      在里面写上了
    • conanfile.txt
       [requires]
       poco/1.9.4
      
       [generators]
       cmake
      
      

    接下来:我们将安装所需的依赖项并生成构建系统的信息

    首先我们创建一个文件夹,里面放上我们刚刚写的依赖于库文件的.cpp文件,命名为;md5.cpp,然后在创建一个名为build的文件夹,一会用来构建工程。现在我们的目录结构是这样的:
    在这里插入图片描述

    在正式开始下载库文件并编译的前,我们先告诉conan使用c++11的标准来编译我们需要的库文件。
    执行下面指令:

    conan profile update settings.compiler.libcxx=libstdc++11 default
    
    

    现在开始使用conan编译我们的库文件,首先进入build文件夹然后执行指令:

    conan install .. 
    

    如果你是初次安装就会看到下面这张截图:
    在这里插入图片描述

    最后安装结束。

    Conan安装了我们的Poco依赖关系,还安装了传递依赖关系:OpenSSL,zlib,sqlite等。它还为我们的构建系统生成了conanbuildinfo.cmake文件。

    在这里插入图片描述
    现在库文件已经安装好了,我们来写一个cmake执行我们的.cpp文件,脚本如下:

    - CMakeLists.txt

    
     cmake_minimum_required(VERSION 2.8.12)
     project(MD5Encrypter)
    
     add_definitions("-std=c++11")
    
     include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
     conan_basic_setup()
    
     add_executable(md5 md5.cpp)
     target_link_libraries(md5 ${CONAN_LIBS})
    

    现在我们的目录结构是:
    在这里插入图片描述

    (CMakeLists.txt 图中文件名写错了!!!!)

    现在我们可以进入build文件夹开始执行了

    • windows的执行命令
    (win)
    $ cmake .. -G "Visual Studio 16"
    $ cmake --build . --config Release
    
    • linux的执行命令
    (linux, mac)
    $ cmake .. -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release
    $ cmake --build .
    ...
    [100%] Built target md5
    $ ./bin/md5
    c3fcd3d76192e4007dfb496cca67e13b
    

    这里我是用的linux,可以看到我的执行结果如下:
    在这里插入图片描述
    在这里插入图片描述

    我们看一眼最终的生成文件夹:
    在这里插入图片描述

    我们需要的东西就在bin文件夹里面,进去执行一下:

    
    root@iZ2ze99clzuka1844h9qy0Z:~/conanTest/build# cd bin
    root@iZ2ze99clzuka1844h9qy0Z:~/conanTest/build/bin# ls
    md5
    root@iZ2ze99clzuka1844h9qy0Z:~/conanTest/build/bin# ./md5
    c3fcd3d76192e4007dfb496cca67e13b
    root@iZ2ze99clzuka1844h9qy0Z:~/conanTest/build/bin# ./md5
    c3fcd3d76192e4007dfb496cca67e13b
    root@iZ2ze99clzuka1844h9qy0Z:~/conanTest/build/bin# ./md5
    c3fcd3d76192e4007dfb496cca67e13b
    root@iZ2ze99clzuka1844h9qy0Z:~/conanTest/build/bin# ./md5
    c3fcd3d76192e4007dfb496cca67e13b
    root@iZ2ze99clzuka1844h9qy0Z:~/conanTest/build/bin# ./md5
    c3fcd3d76192e4007dfb496cca67e13b
    root@iZ2ze99clzuka1844h9qy0Z:~/conanTest/build/bin# ./md5
    c3fcd3d76192e4007dfb496cca67e13b
    
    

    可以看到已经执行成功啦。

    四、快速总结conan

    1. conna是个 c++/c 的包管理工具,基于python开发,开源。
    2. conan需要编写conanfile.txt来说明依赖。
    3. conan search -r=conan指令可以在远程仓库搜索包
    4. conan install 指令来根据conanfile.txt安装库文件
    5. 最终生成文件:conanbuildinfo.txt
    6. 编写cmake后编译工程
    7. 完成使用
    • 文中所用命令
    # 安装
    pip install conan
    
    # 版本
    conan --version
    
    # 升级
    pip install conan --upgrade  
     
    # 搜索包
    conan search poco --remote=conan-center
    conan search libpng -r=conan-center
      
    # 查看  
    conan inspect poco/1.9.4
      
    # 配置文件名  
    conanfile.txt
      
    # 设置默认编译版本 
    conan profile update settings.compiler.libcxx=libstdc++11 default
    
    # 安装库
    conan install .. 
    
    
    # cmake使用例子
    cmake_minimum_required(VERSION 2.8.12)
    project(MD5Encrypter)
    
    add_definitions("-std=c++11")
    
    include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
    conan_basic_setup()
    
    add_executable(md5 md5.cpp)
    target_link_libraries(md5 ${CONAN_LIBS})
     
     
     
    # linux构建命令
    $ cmake .. -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release
    $ cmake --build .
    
    
    展开全文
  • Conan是一个开源的、跨平台的、去中心化的C和C++包管理器,它的源码在https://github.com/conan-io/conan ,License为MIT,最新发布版本为1.38.0,由Python实现。版本更新较频繁,但保持向前兼容。 Conan特点: ...

        Conan是一个开源的、跨平台的、去中心化的C和C++包管理器,它的源码在https://github.com/conan-io/conan ,License为MIT,最新发布版本为1.38.0,由Python实现。版本更新较频繁,但保持向前兼容。

        Conan特点

        (1).它是完全去中心化的:用户可以将他们的包托管在他们的私有服务器上,与JFrog Artifactory 和ConanCenter集成。具有客户端----服务器架构,客户端可以从不同的服务器(“远程”)获取包,也可以将包上传到不同的服务器,similar to the “git” push-pull model to/from git remotes.

        (2).它适用于所有平台:包括Linux、OSX、Windows、Android、iOS,也支持嵌入式,还支持交叉编译。

        (3).管理二进制文件:它可以为任何配置和平台甚至包括交叉编译创建、上传和下载二进制文件,从而节省大量开发和持续集成时间。二进制兼容性也可以配置和定制。在所有平台上以相同的方式管理所有工件。

        (4).与任何构建系统集成,包括任何专有和定制系统:为主要构建系统(CMake、Visual Studio MSBuild、Makefiles、Meson等)提供经过测试的支持。

        (5).可扩展。

        ConanCenter:是一个中央公共存储库,包含数百个流行的开源库包,以及许多针对主流编译器版本的预编译二进制文件。

        JFrog Artifactory Community Edition (CE):是推荐的、免费的、Conan服务器,可在你的控制下私下托管你自己的包。它是JFrog Artifactory for Conan包的免费社区版。

        Conan client:命令行工具,用于创建包和使用包,可创建本地仓库支持离线使用。

        Conan server:可私有化部署的服务器,是一个与Conan客户端一起分布的小型服务器。 它是一个简单的开源实现,提供基本功能。

      安装Conan:这里通过Conda安装Conan,关于Conda的介绍可以参考:https://blog.csdn.net/fengbingchun/article/details/86212252 ,python的版本需要3.8

    conda create -n test_conan python=3.8
    conda activate test_conan
    pip install conan #conda install -c conda-forge conan

        在Conan中,一个包的定义:包名/版本@用户/渠道

        Conan客户端常用命令

        (1).查看conan版本:conan --version

        (2).搜索软件包,如opencv:conan search opencv* -r=all (或-r=conan-center)

        (3).显示所有源:conan remote list

        (4).通过conanfile.txt安装依赖包:conan install .

        下面是下载openssl 1.0.2s依赖包示例,conanfile.txt内容如下:

    [requires]
    openssl/1.0.2s
    
    [generators]
    cmake

        在conanfile.txt目录下执行以下命令:

    ~/Disk/anaconda3/envs/test_conan/bin/conan install . -s arch=x86_64 -s compiler=gcc -s compiler.libcxx=libstdc++ -s compiler.version=4.9 -s os=Linux --build=openssl --build=zlib

        执行结果如下图所示,会在~/.conan/data/openssl/1.0.2s目录下生成对应的头文件和库:

        执行上述命令前,在当前目录下仅有conanfile.txt一个文件,执行完后会多出几个文件,如下图所示:

    展开全文
  • 0x00 Conan 是啥 Conan 与 C++ 的关系可以用以下内容作类比: - Maven 之于 Java - pip 之于 Python ...C++ 包管理工具在所有方案中比较“中庸” 方案 例子 构建速度 版本管理能力 易用性 ...

    0x00 Conan 是啥

    Conan 与 C++ 的关系可以用以下内容作类比:

    • Maven 之于 Java
    • pip 之于 Python
    • npm 之于 Node.js
    • gem 之于 Ruby

    0x01 为啥要用 Conan

    分两个层面来说:

    C++ 包管理工具在所有方案中比较“中庸”

    方案例子构建速度版本管理能力易用性
    系统安装包管理器apt-get最快无法管理
    包管理工具conan较快可控性较高较难
    自己维护二进制包git可控性高(代价高)较难
    源码编译Bazel可控性高

    C++ 包管理工具中,Conan 用的人多

    • Conan:https://github.com/conan-io/conan
    • CPM:https://github.com/iauns/cpm
    • biicode:https://github.com/biicode

    以上三个知名 C++ 包管理工具只有 Conan 还在继续更新。

    0x02 Conan 工作机制

    Conan 的主要特性:

    特性一:开源

    Conan 工具本身(即 Conan client & Conan server)是开源的

    特性二:去中心化的包管理工具

    与 git 的理念类似,Conan 有本地仓库与远程仓库的概念

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IA90Nzvk-1575689298807)(https://docs.conan.io/en/latest/_images/systems.png)]

    • Conan client:命令行工具,用于创建包和使用包,可创建本地仓库支持离线使用
    • Conan server:可私有化部署的服务
    • JFrog Artifactory:可私有化部署的仓库
    • JFrog Bintray:公开&公共仓库

    特性三:二进制管理

    Conan 最主要的功能就是可以管理好预编译好的二进制文件用于后续打包。

    • 在 Conan 中,一个包的定义: 包名/版本@用户/渠道
    • 同一个包在不同配置下(OS / Architecture / Build Type / Compiler / Compiler Version / compiler.libcxx)构建出的文件将分别保存并支持按需获取

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Orfm1MYV-1575689298807)(https://docs.conan.io/en/latest/_images/binary_mgmt.png)]

    特性四:跨平台

    用Python写的,主流系统及研发工具均支持

    0x03 Conan 环境搭建

    JFrog Artifactory Community edition for C/C++::https://bintray.com/jfrog/product/JFrog-Artifactory-Cpp-CE/view

    Conan:https://conan.io/downloads.html

    0x04 集成 Conan

    Conan支持的集成方式很多:https://docs.conan.io/en/latest/integrations.html。

    这里我们以 makefile 工程来做简单说明,我们要用到 conanfile.py 以及 AutoToolsBuildEnvironment。

    • 源码:https://github.com/memsharded/conan-example-makefiles
    • 步骤:https://docs.conan.io/en/latest/howtos/makefiles.html
    • 文档:https://docs.conan.io/en/latest/reference/conanfile.html
    展开全文
  • c++包管理工具conan

    2017-03-09 13:45:00
    Conan is a portable package manager, intended for C and C++ developers, but it is able to manage builds from source, dependencies, and precompiled binaries ...Conan是一个跨平台的包管理工具,面向c和c++...
  • 创建一个的最简步骤 1. conan new 生成一个conanfile.py 2. 编辑conanfile.py 3. conan create --prefile=xxx directory or reference 了解Conan的本地仓库 当执行 $conan new task_control/v1.0.0 $conan ...
  • sudo pip install conan 参考官网的demo git clone https://github.com/memsharded/example-poco-timer.git mytimer 命令 查看本地库 conan search 安装库 conan install zlib/1.2.8@lasote/stable 删除库 conan ...
  • Conan:[工具] Conan.io-开源CC ++程序包管理
  • Conan C / C ++程序包管理器的虚幻生成器 它是一个生成器程序包,它不是嵌入在主要的conan.io代码库中,而是一个独立的程序包。 阅读了解更多信息。 使用发电机 正在安装 unreal生成器打包在UnrealGen/2.0@...
  • conan是一个跨平台的包管理工具,面向C和C++开发者,但是它能够从源码,依赖和预编译二进制包。 二、安装 先决条件 1、安装Python3.5以上版本。 2、安装过程中要安装pip。 安装过程 1、安装命令:pip install conan...
  • 测试使用的是JFrog Artifactory CE 进行的私有包管理,具体的安装可以参考相关文档 启动JFrog Artifactory CE 使用docker docker run -d -p 8081:8081 docker.bintray.io/jfrog/artifactory-cpp-ce ...
  • conan依赖管理使用方法

    千次阅读 2020-10-13 15:45:17
    C++程序的依赖管理是一个由来已久的问题, 仅在Windows上就有程序就有Visual Studio, MinGW等多种编译器, 即使是Visual Studio下编译的结果的也有静态库, 动态库, x86,x86_x64程序之分, 针对运行和调试环境有Debug和...
  • 柯南C和C ++软件包管理器的CMake包装器。 该cmake模块允许从cmake启动conan install 。 此仓库中的分支是: 开发:PR合并到此分支。 最新发展状况 大师:最新版本 标记版本: : 。 您可能希望使用带标签的发行...
  • Conan 中的“”概念

    千次阅读 2018-09-11 14:33:09
    Conan 作为 C++ 包管理软件,最重要的功能就是“包”,因此我们需要仔细看看其包管理的基本概念。 定义:“包” 与 “二进制包” Conan 最主要的功能就是可以管理好预编译好的二进制文件用于后续打包。关于“包...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 658
精华内容 263
关键字:

conan包管理