zoukankan      html  css  js  c++  java
  • conan使用(二)--创建私有仓库

    前面我们已经能够使用conan来从公共服务器上拉取C/C++包来集成进我的工程中,但是在实际开发中,我们可能需要自己封装或使用非公开的库,那么自己搭建一个私服是个很现实的需求。
    搭建conan私服有几种方式,这里介绍一种目前使用比较多的Artifactory方式。

    1. 安装和配置Artifactory

    我们以docker的方式拉取Artifactory镜像(这一步可能花费时间会比较久):

    docker pull docker.bintray.io/jfrog/artifactory-cpp-ce
    

    image.png
    然后安装:

    sudo docker run -d -p 8081:8081 --name artifactory-cpp-ce docker.bintray.io/jfrog/artifactory-cpp-ce
    

    image.png
    那么我们就已经创建了一个Artifactory服务器。通过8081端口可以直接访问。默认账号密码:admin(password)。
    登录后我们可以跳过proxy设置,直接创建一个名为develope的conan仓库:
    image.png

    然后直接点击develope,它会告诉你怎么在客户端进行配置:
    image.png
    按照它的提示进行配置,注意替换等字样;如果是不在同一台机器上,也请修正ip地址。

    2. 本地创建conan包

    首先创建一个新的目录conanpkg,然后在该目录下执行

    conan new Hello/1.0.1 -t
    

    使用-t参数的意义是生成一个测试包。
    image.png
    conanfile.py文件非常关键,它定义了如何打包,如何导入源文件:

    from conans import ConanFile, CMake, tools
    
    
    class HelloConan(ConanFile):
        name = "Hello"
        version = "1.0.1"
        license = "<Put the package license here>"
        author = "<Put your name here> <And your email here>"
        url = "<Package recipe repository url here, for issues about the package>"
        description = "<Description of Hello here>"
        topics = ("<Put some tag here>", "<here>", "<and 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/conan-io/hello.git")
            # 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(HelloWorld)",
                                  '''PROJECT(HelloWorld)
    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"]
    
    
    
    • source函数是表示如何导入源文件,这里是指明了代码仓库;
    • build指明要如何编译;
    • package是打包你的项目。

    test_package 目录下的代码是测试包代码,创建好包后你可以用它进行测试。
    现在执行create命令进行打包:

    conan create . demo/testing
    

    create命令会执行以下操作:

    • 将conanfile.py从用户文件夹拷贝到conan的本地缓存中;
    • 安装包,强制从源构建它;
    • 移动到test_package文件夹并创建临时构建文件夹;
    • 执行conan install …,以安装test_package/conanfile.py的要求;
    • 构建并启动示例程序,分别调用test_package/conanfile.py文件的build()和test()方法。

    即相当于执行了以下命令:

    conan export . demo/testing
    $ conan install Hello/1.0.1@demo/testing --build=Hello
    # test
    $ conan test test_package Hello/1.0.1@demo/testing
    

    如此一个包就已经创建好了。

    3. 上传包到服务器

    上传包命令是:

    conan upload <RECIPE> -r <REMOTE> --all
    

    <RECIPE> 即是我们在经常用到的一个包名字:/@/。我们上面创建的包名字就是Hello/1.0.1@demo/testing。(上传需要进行账户密码验证)
    此时远程服务器上就有了我们的包:
    image.png
    此时就可以像其它包一样正常在其它地方使用。

    4. 用法补充

    4.1 不使用git导入源码

    上面的例子中是在source中使用git拉取代码,如果我们的代码不是在git上怎么办?
    (1)HTTP下载
    同样是在source函数中,可以使用http下载源码:

    zip_name = "XXX"
    tools.download("https://github.com/XXXXXXXXXXXXX/%s" % zip_name, zip_name)
    tools.unzip(zip_name)
    ...
    

    (2)本地代码
    此时就不能使用source函数,需要删掉它,增加一个exports_sources 配置来代表你的源码目录:

    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/*"
        ...
    
  • 相关阅读:
    Servlet到底是单例还是多例你了解吗?
    Idea的一些调试技巧及设置todo
    Android如何使用so文件和Android studio中导入so
    Android 自定义控件之app标题栏的封装
    Android 动态添加删除ExpandableListView的item的例子
    Android 利用ListView制作带竖线的多彩表格
    Android EditText 改变边框颜色
    Android 使用Okhttp/Retrofit持久化cookie的简便方式
    Android 一个漂亮的Android Spinner
    Android 带清除功能的输入框控件EditText
  • 原文地址:https://www.cnblogs.com/xl2432/p/11896466.html
Copyright © 2011-2022 走看看