<p>conan list 默认只显示最新 revision,需加 --revisions 和 #* 才能查全部;upload 不加 -c 不影响远程旧版,加 -c 会清空所有远程 revisions;conan remove -r 对远程无效,删远程须用 Artifactory API 或 JFrog CLI。</p>

conan remote list 能看到但 conan list 查不到旧版
这是最常见现象:远程仓库里明明有多个 hello/1.0 的 revision(比如 r1、r2),但执行 conan list "hello/1.0" -r=myremote 只返回最新 revision。Conan 2.x 默认只显示 latest revision,不是“所有历史版本”。
要查全量,必须显式带上通配符和 --revisions:
-
conan list "hello/1.0#*"—— 查该 recipe 所有 revisions(不指定 remote 时查本地缓存) -
conan list "hello/1.0#*" -r=myremote --revisions—— 查远程仓库中该 recipe 的全部 revisions -
conan list "hello/1.0#r123abc" -r=myremote—— 精确查某一个 revision 的二进制包列表
注意:--revisions 是必须的,否则即使写了 #*,Conan 仍按单 revision 模式处理,结果为空或仅 latest。
上传时没带 -c 就丢掉旧二进制
执行 conan upload hello/1.0 -r=myremote(不加 -c)时,Conan 只上传当前本地缓存中该 reference 对应的 *latest* revision 的二进制包,**不会触碰远程已存在的其他 revisions**——这听起来安全,但实际是陷阱:如果你本地只有 r2 的二进制,上传后 r1 的二进制在远程依然存在,但你无法再通过 conan install 解析到它,因为 lockfile 默认绑定 latest recipe revision。
真正危险的是这个命令:conan upload hello/1.0 -c -r=myremote。其中 -c(--check)会先清空远程该 reference 下 *所有* revisions,再上传当前本地缓存中的 revision 及其二进制。误用等于批量删旧版。
稳妥做法:
- 确认要保留旧版 → 上传时**永远不加
-c**,用conan upload hello/1.0#r123abc -r=myremote精确上传单 revision - 需要同步整套旧版 → 先
conan download hello/1.0#r123abc -r=myremote拉下来,再conan upload hello/1.0#r123abc -r=myremote
Artifactory 里手动删 revision 很危险
Artifactory UI 或 REST API 支持直接删除某个 hello/1.0#r123abc,但操作后可能引发不一致:
- 如果该 revision 的二进制被其他 package(如
mylib/2.0)依赖过,conan install仍会尝试解析它,导致失败并报Recipe not found - Conan 客户端缓存的
conan.lock文件里若硬编码了该 revision,后续conan install会卡在远程校验阶段 - Artifactory 的 virtual repo 聚合逻辑可能因底层 deletion 出现元数据延迟,造成短暂 404
生产环境建议:旧 revision 不删,而是打标签标记为 deprecated,并在 conandata.yml 里注明停用原因和替代方案。真正要清理时,先跑一遍 conan list "*#*" -r=myremote | grep r123abc 确认无下游引用,再操作。
conan remove 命令对远程无效
新手常误以为 conan remove hello/1.0 -r=myremote 能删远程旧版,实际上该命令**只作用于本地缓存**,对远程仓库完全无影响(Conan 2.x 已移除远程删除能力)。
想删远程内容,只有两个合法途径:
- 用 Artifactory/Nexus 管理界面或 REST API(如
DELETE /artifactory/api/conan/myrepo/v2/hello/1.0/r123abc) - 用 JFrog CLI:
jfrog rt del "myrepo/hello/1.0#r123abc/**" --recursive
没有第三个选项。任何文档里写 “conan remove -r 删除远程” 都是 Conan 1.x 过时信息,2026 年已不可用。
revision 管理真正的难点不在命令怎么敲,而在于团队是否统一了“什么算旧版”——是按时间?按 semver patch?还是按内部发布流水号?一旦策略模糊,#r* 就会变成没人敢动的黑箱。

















