如何在Conan打包时排除源代码,仅保留头文件与编译后的静态库?
无源码Conan包创建方案
以下为适配Conan 1.x版本的可行实现方案:
方案1:使用conan export-pkg直接打包预编译产物(最推荐)
该方案完全跳过源码导出逻辑,从根源避免源码被打包进配方:
- 第一步:本地完成源码编译,将生成的.h头文件、静态库文件(.a/.lib)分别整理到本地目录的
include、lib子目录中,例如统一存放在项目根目录的artifact_output文件夹下 - 第二步:编写
conanfile.py,无需配置exports、exports_sources字段,也无需实现build()方法,仅编写package()和package_info()逻辑即可,参考示例:
from conans import ConanFile class SelfDevelopedLibConan(ConanFile): name = "your_lib_name" version = "1.0.0" settings = "os", "compiler", "build_type", "arch" def package(self): # 直接复制本地预编译产物到包目录 self.copy("*.h", dst="include", src="artifact_output/include") self.copy("*.a", dst="lib", src="artifact_output/lib") self.copy("*.lib", dst="lib", src="artifact_output/lib") def package_info(self): # 声明链接时需要的库名 self.cpp_info.libs = ["your_lib_name"]
- 第三步:执行
conan export-pkg . your_lib_name/1.0.0@your_namespace/your_channel命令完成打包,该命令只会将package()方法指定的产物纳入包中,不会生成conan_sources.tgz源码压缩包
方案2:使用post_export钩子自动清理源码包(适配conan create流程)
如果必须使用conan create全流程构建,可在conanfile.py中添加导出后钩子,自动删除生成的源码包:
- 在
conanfile.py中添加如下方法:
def post_export(self): import os source_tgz_path = os.path.join(self.export_folder, "conan_sources.tgz") if os.path.exists(source_tgz_path): os.remove(source_tgz_path)
- 正常执行
conan create命令即可,导出完成后源码包会被自动删除,不会随配方上传到Artifactory
结果验证
打包完成后可执行conan get your_lib_name/1.0.0@your_namespace/your_channel查看配方导出目录的文件列表,确认不存在conan_sources.tgz即可。最终上传到Artifactory的包仅包含头文件、编译后的静态库与配方文件,无任何.cpp源码泄露风险。
内容的提问来源于stack exchange,提问作者Chikashi Miyama
相关产品推荐
相关产品推荐

