Conan远程仓库URL必须包含/api/conan/路径,否则因接口不可达导致404或响应错误;需配置虚拟仓库并启用元数据索引与搜索包含,且上传须显式执行conan upload。

conan remote add 时 URL 必须带 /api/conan/ 路径
Artifactory 或 Nexus 这类制品服务器,不是把 Conan 包直接放在根路径下就能访问的。Conan 客户端发起请求时,会自动拼接 /v2/、/files/ 等子路径,而 Artifactory 的 Conan 插件只在 /api/conan/ 下暴露标准接口。漏掉这一段,conan install 会报 404 Not Found 或 Invalid server response。
正确写法示例:
conan remote add artifactory https://artifactory.example.com/artifactory/api/conan/cpp-all
常见错误写法(全部失效):
-
https://artifactory.example.com/artifactory/cpp-all(缺/api/conan/) -
https://artifactory.example.com/artifactory/api/conan/(结尾多斜杠,且没指定虚拟仓库名) -
https://artifactory.example.com/cpp-all(完全绕过 Artifactory 的 Conan 插件)
conan user -p 必须配合 --password-stdin 或环境变量,不能明文输密码
Conan 2.x 默认禁用终端交互式密码输入,conan user -p 直接跟密码字符串会被拒绝,报错 ERROR: Password not allowed as argument。这是安全策略,不是 bug。
推荐三种安全传参方式:
- 用
--password-stdin管道传入:echo "mypassword" | conan user -p --password-stdin -r artifactory admin - 设环境变量
CONAN_LOGIN_USERNAME和CONAN_PASSWORD,再执行conan user -r artifactory - CI/CD 中用
conan remote login+ token(需 Artifactory 提前生成 API Key)
注意:Artifactory 用户必须有对应仓库的 Deploy/Cache 权限才能上传,仅有 Read 权限只能 conan install。
自建服务端要开虚拟仓库,别只配本地仓
只创建一个 conan-local 本地仓库,然后把它当远程加进 Conan 客户端,是行不通的。Conan 客户端查包时会先向远程发 search 请求,而 Artifactory 的本地仓库不响应搜索 API —— 它只存东西,不索引也不聚合。
必须创建一个虚拟仓库(如 cpp-all),并把 conan-local 和 conan-center(远程代理)都加进去。客户端只连这个虚拟仓,所有读写操作才真正路由到后端。
验证是否生效:
conan remote list-ref
输出里应显示该远程已绑定默认 ref;再执行:
conan search "*/*@*/*" -r artifactory
如果返回一堆包名,说明虚拟仓和后端联动正常;如果空或报错,大概率是虚拟仓没启用“Include in Search”或后端仓库未勾选“Enable Metadata Indexing”。
上传包前先确认 conan create 的 --build=missing 行为
conan create . --build=missing 看似简单,但容易忽略两点:一是它只构建当前 recipe 对应的配置(settings 和 options),二是不会自动上传到远程 —— 上传是独立动作。
典型误操作链:
- 本地
conan create成功 → 以为包已进私有仓 - 换台机器
conan install失败 → 报Package not found
正确流程是:
-
conan create . --build=missing(生成本地缓存包) -
conan upload "fast-lzma2/1.0.1@" -r artifactory --force(显式上传) - 上传后,用
conan list "fast-lzma2/1.0.1@*" -r artifactory确认存在
注意:--force 不是必需,但能避免因已有同名包版本导致跳过上传;conan upload 默认只传 binary,recipe 需加 --all 才同步。
虚拟仓库的“聚合”不是自动发生的,它依赖每个后端仓库的元数据索引是否开启、权限是否放通、以及客户端请求路径是否精准匹配插件入口 —— 少一个环节,整个链路就断在中间,而且错误信息往往模糊。调试时优先检查 /api/conan/ 路径和虚拟仓配置页的两个开关:“Enable Metadata Indexing”和“Include in Search”。


















