conan upload是唯一可行路径,因conan包需客户端签名、校验及分片上传,web界面仅支持扁平文件,不兼容其多层结构与协议交互。

不能用页面上传 Conan 包,必须用 conan upload 命令行操作。 私有依赖库的 Web 界面明确不支持 Conan 类型组件,这是硬性限制,不是权限或配置问题。
为什么 conan upload 是唯一可行路径
Conan 包本质是带元数据(conanfile.py、conanmanifest.txt)和二进制文件的结构化目录,需通过 Conan 客户端签名、校验、分片上传。Web 页面只支持扁平文件上传(如 .jar、.whl),无法处理 Conan 的多层结构与远程协议交互。
- 私有依赖库页面提示:“当前页面上传功能不支持 Conan 类型组件”
- GitLab、Artifactory、CodeArts 等所有主流私有仓库对 Conan 的支持都基于 REST API +
conanCLI,而非表单提交 - 试图用
curl或浏览器上传会失败:返回 405 Method Not Allowed 或 415 Unsupported Media Type
conan upload 必须满足的三个前提
漏掉任意一个都会卡在认证失败、找不到包、或 403 Forbidden。
-
conan remote add <name><url></url></name>已执行,且<url></url>末尾必须包含/v1或/api/conan/<repo-name></repo-name>(取决于后端,Artifactory 要/api/conan/<repo></repo>,GitLab 是/-/conan/v1) -
conan user -r <name> -p "<password>" <username></username></password></name>已登录,密码含特殊字符必须加双引号 - 目标包已存在本地缓存:
conan export-pkg或conan create成功执行过,且conan search <ref></ref>能查到(例如conan search cjson/1.7.15@)
上传预编译库时最常踩的坑
尤其适用于只有 include/ 和 lib/ 目录、无源码的场景(如 cJSON、OpenSSL 预编译版)。
-
conan export-pkg报错ERROR: cjson/1.7.15: 'settings.compiler.libcxx' value not defined:纯 C 库必须在conanfile.py中显式删除该 setting:def configure(self): del self.settings.compiler.libcxx - 上传后客户端拉不到包:检查
conanfile.py里的settings是否和你实际构建环境一致(比如你传的是linux-armv8,但 profile 里写的是armv7,conan install就会跳过) - 上传成功但显示“no packages found”:确认
conan upload命令末尾加了--all(否则只传 recipe,不传二进制);另外 Artifactory 默认关闭“anonymous read”,未登录用户看不到包
真正麻烦的从来不是命令本身,而是 conanfile.py 里那几行 settings 和 configure 的匹配逻辑——它不像 npm 或 pip 那样“扔进去就跑”,每个平台、每个编译器组合都得显式声明,漏一个就断在下游。











