能否编写Conan配方下载安装网络包及GitHub上的CMake项目?
本地构建GitHub上的CMake项目作为Conan依赖
完全可以实现,通过编写conanfile.py就能完成源码拉取、构建、打包全流程,让这个库像其他Conan依赖一样被引用,具体步骤如下:
- 创建Conan配方文件
新建一个专属文件夹(比如mylib-conan),里面创建conanfile.py,示例代码如下,根据你的实际库调整参数:
from conans import ConanFile, CMake, tools class MyLibConan(ConanFile): name = "mylib" version = "1.0.0" settings = "os", "compiler", "build_type", "arch" generators = "cmake" def source(self): # 从GitHub拉取源码,替换成你的仓库地址、分支或tag git = tools.Git(folder="mylib_source") git.clone("https://github.com/xxx/mylib.git", branch="main") # 如果要指定特定版本,改用tag参数:git.clone(url, tag="v1.0.0") def build(self): cmake = CMake(self) # 配置CMake项目,路径指向拉取的源码目录 cmake.configure(source_folder="mylib_source") cmake.build() # 部分项目需要执行安装步骤,可添加:cmake.install() def package(self): # 复制头文件到Conan包的include目录 self.copy("*.h", dst="include", src="mylib_source/include") # 复制编译好的库文件到对应目录,根据实际编译输出路径调整 self.copy("*.a", dst="lib", src="mylib_source/build/lib", keep_path=False) self.copy("*.lib", dst="lib", src="mylib_source/build/lib", keep_path=False) self.copy("*.so", dst="lib", src="mylib_source/build/lib", keep_path=False) self.copy("*.dll", dst="bin", src="mylib_source/build/bin", keep_path=False) def package_info(self): # 声明依赖此包时需要链接的库名 self.cpp_info.libs = ["mylib"]
- 本地安装配方到Conan仓库
在配方文件夹下执行命令,将包存入本地Conan仓库:
conan create . user/testing
这里的user/testing是自定义频道,你可以换成自己的命名规则(比如myteam/stable)。
- 在其他项目中引用
在你的项目的conanfile.txt或conanfile.py中添加该依赖:
# conanfile.txt示例 [requires] mylib/1.0.0@user/testing [generators] cmake
之后执行conan install .就能拉取这个本地包,和其他Conan依赖一样正常使用。
编写配方从网络下载并安装预编译软件包
这也完全支持,适合依赖已有预编译二进制包的场景,核心是用Conan工具类完成下载、解压、打包流程,示例配方如下:
from conans import ConanFile, tools import os class PrebuiltLibConan(ConanFile): name = "prebuiltlib" version = "2.3.0" settings = "os", "arch" def source(self): # 根据系统和架构匹配对应下载链接 if self.settings.os == "Linux" and self.settings.arch == "x86_64": url = "https://example.com/prebuiltlib-linux-x64.zip" elif self.settings.os == "Windows" and self.settings.arch == "x86_64": url = "https://example.com/prebuiltlib-win-x64.zip" else: raise Exception("Unsupported platform") # 下载并解压包,完成后清理压缩文件 tools.download(url, "prebuiltlib.zip") tools.unzip("prebuiltlib.zip") os.remove("prebuiltlib.zip") def package(self): # 复制预编译的头文件和库文件到Conan包的对应目录 self.copy("*.h", dst="include", src="prebuiltlib/include") self.copy("*.a", dst="lib", src="prebuiltlib/lib", keep_path=False) self.copy("*.lib", dst="lib", src="prebuiltlib/lib", keep_path=False) self.copy("*.so", dst="lib", src="prebuiltlib/lib", keep_path=False) self.copy("*.dll", dst="bin", src="prebuiltlib/bin", keep_path=False) def package_info(self): self.cpp_info.libs = ["prebuiltlib"]
同样执行conan create . user/testing安装到本地仓库,之后就能在其他项目里当作常规依赖引用。
内容的提问来源于stack exchange,提问作者GaryO
相关产品推荐
相关产品推荐

