必须先完成包创建、本地验证、远程配置三步,缺一不可;核心是正确编写conanfile.py,明确source()、build()、package()逻辑,设置匹配的settings/options,执行conan create验证成功后,再通过conan remote add和conan upload -r --all上传至指定远程。

直接结论:不能只靠 conan upload 就把内部库“放进去”——必须先完成包创建、本地验证、远程配置三步,缺一不可。
怎么写一个能上传的 conanfile.py
核心是让 Conan 知道你的代码在哪、怎么编译、怎么导出头文件和库文件。常见错误是直接复制模板但没改 source() 和 package() 逻辑。
- 如果源码在本地目录(比如
./src),用tools.copy(self, "*", src=os.path.join(self.source_folder, "src"), dst="include")拷头文件,别漏self.source_folder - 如果用了 CMake 构建,
build()里必须调cmake.build(),且package()中要显式 copy 生成的.a/.so/.lib到self.package_folder - 别忽略
settings和options:内部库若只支持 Linux x86_64 GCC,就写死settings = "os", "arch", "compiler",避免被误用于 Windows - 示例片段:
def package(self): self.copy("*.h", dst="include", src="src") self.copy("*.a", dst="lib", keep_path=False)
上传前必须跑通 conan create
这是最容易跳过的验证环节。不本地构建成功,上传后别人拉下来一样会失败。
- 执行
conan create . user/channel(比如conan create . myteam/stable),观察是否生成了package/xxx目录且含预期文件 - 失败常见原因:CMake 找不到工具链、
self.settings.compiler.version未匹配本地 profile、requires中引用了未安装的依赖 - 确认 profile 匹配:用
conan profile show default检查compiler.version和你构建环境一致,否则加--profile=xxx
远程仓库配置错,upload 就是往空里扔
conan upload 默认只传到 conan-center,你得先告诉它“往哪传”。Artifactory 虚拟仓库 URL 容易写错,尤其路径后缀。
- 添加远程:
conan remote add artifactory https://your-artifactory.example.com/artifactory/api/conan/cpp-all(注意末尾是/cpp-all,不是/conan-local) - 登录认证:
conan user -p "your-api-key" -r artifactory your-username;API Key 比密码更安全,Artifactory 后台可生成 - 上传命令:
conan upload "Hello/1.0.1@myteam/stable" -r artifactory --all(--all必须加,否则只传 recipe 不传二进制) - 常见报错
ERROR: Remote 'artifactory' not found:说明conan remote list里没出现你起的名字,检查拼写或是否漏执行add
上传后别人 still can't find it?检查虚拟仓库聚合
Artifactory 里只建了 conan-local 但没把它加进 cpp-all 虚拟仓库,客户端就查不到——这是企业部署中最常被忽略的一步。
- 登录 Artifactory Web UI → Repositories → Virtual Repositories →
cpp-all→ “Selected Repositories” 里必须包含你的cpp-local - 客户端执行
conan search Hello/1.0.1@myteam/stable -r artifactory应返回结果;若为空,优先查虚拟仓库配置,而不是重传 - 权限问题:确保用户所属 group 在
cpp-local上有Deploy/Cache权限,否则upload会静默失败(无报错但实际没存)











