Conan私有仓库历史包丢失主因是远程仓库自动清理策略启用或上传覆盖,需禁用Artifactory的Cleanup Policy、勾选Retain Unused Packages、上传时加--no-overwrite参数并确保权限与存储配额正常。

Conan私有仓库本身不自动删除历史构建产物——但你得主动关掉“自动清理”机制,否则 Artifactory 或 Nexus 会按策略清掉旧版本包。关键不在 Conan 客户端,而在远程仓库的配置和上传方式。
Artifactory 中禁用自动清理策略
Artifactory 默认不会删包,但如果你启用了 Repository Cleanup 策略(比如基于 age 或 unused 时间),历史包就会被静默移除。
- 进 Artifactory →
Administration→Repositories→ 找到你的本地仓库(如cpp-local)→Configuration标签页 - 检查
Cleanup Policy是否启用;若已启用,直接清空该字段或设为None - 确认
Retain Unused Packages勾选状态:不勾选 = 未被任何依赖图引用的包可能被标记为“可清理”,勾选更保险 - 虚拟仓库(
cpp-all)无需配清理策略,它只是聚合入口,不存实际二进制
上传时避免覆盖同名包(version + user/channel 冲突)
Conan 的 conan upload 默认允许覆盖,如果没加 --no-overwrite,同一 ref(如 cjson/1.7.15@user/stable)再次上传会直接替换,旧二进制就丢了。
- 强制保留历史:每次上传都换
channel,比如用构建流水线 ID 或时间戳:cjson/1.7.15@ci/20260920-1423 - 或统一用
stablechannel,但严格按语义化版本升版(1.7.15→1.7.16),禁止复用旧 version - CI 脚本中务必加参数:
conan upload "cjson/*" -r cpp-local --no-overwrite,遇到已存在 ref 直接报错退出,不掩盖问题
权限与写入策略影响包保留
看似是存储问题,实则常因权限配置导致“上传成功但不可见”,误以为包丢了。
- 确保上传账号对目标本地仓库(如
cpp-local)有Deploy/Cache权限,仅Read权限会导致conan upload静默失败(返回码 0,但日志里有403 Forbidden) - 检查 Artifactory 的
Storage Quota:空间满时新上传可能失败,旧包却不会自动腾挪,需人工干预 - Conan 客户端缓存(
~/.conan/data)里的包不会被远程策略影响,但它是本地副本,不能当历史备份用
真正容易被忽略的是:Artifactory 的 Retention Period 设置藏在 Admin → Storage → Filestore 里,它控制底层文件系统级的垃圾回收周期——哪怕包没被逻辑删除,超期后也可能被物理清除。这个开关默认关闭,但一旦打开,必须和业务发布节奏对齐,否则某天早上你会发现上周五的 ARM 构建包全没了。


















