ci中conan install拉不到私有包,主因是远程未显式添加、认证未绑定远程、缓存干扰或默认启用conancenter;须在脚本首行add remote并验证、-r指定登录、禁用conancenter、精确匹配requires、确认virtual repo聚合与权限。

CI里conan install拉不到私有包,90%不是网络或Token失效,而是远程没加对、认证没生效、或本地缓存干扰了远程解析。
conan remote add 必须在 CI 脚本里显式执行
CI runner 默认不保留上次配置的 remote,每次都是干净环境。只靠本地 conan remote list 看着有,不代表当前会话能用。
- 必须在
script阶段第一行就运行conan remote add,URL 末尾带/v1或/api/conan/xxx(依 Artifactory/Nexus 实际路径) - 若用 GitLab CI,
conan remote add artifactory https://artifactory.example.com/artifactory/api/conan/conan-virtual后要立刻conan remote list验证是否出现在输出中 - 别依赖
.conan/remotes.json提交进仓库——它会被 CI 覆盖,且含敏感信息风险
conan user -p 必须配对 -r 指定远程名
conan user 不指定 -r 就是全局登录,但 Conan 2.x 默认只对当前 remote 生效;漏掉 -r 导致认证挂在 wrong remote 上,静默失败。
- 写法必须是:
conan user -p "$CONAN_PASSWORD" -r artifactory "$CONAN_USERNAME" -
$CONAN_USERNAME通常为admin或服务账号,$CONAN_PASSWORD来自 CI 变量,**不能硬编码在脚本里** - Artifactory 的
conan-virtual远程需开启 “Anonymous Access” 或确保账号有 read 权限,否则conan install卡在Looking for package不报错
conan install 要禁用默认远程 conancenter
Conan 2.9.2+ 默认启用了 conancenter 远程(URL https://center2.conan.io),它优先级高于你加的私有 remote。私有包 name 冲突或未命中时,会 fallback 到 conancenter 报 Package not found,而不是去你的私有库查。
- CI 脚本中加一行:
conan remote disable conancenter - 或者更彻底:在
conan install命令后加--remote artifactory显式限定 - 验证方式:加
-v参数运行conan install -v,日志里应出现Using remote 'artifactory' (https://...),而非conancenter
conanfile.py / conanfile.txt 的 requires 必须与私有库完全一致
Conan 不做模糊匹配。name、version、user、channel 四者缺一不可,大小写、下划线、连字符全算不同包。
- 假设私有库上传的是
mylib/1.2.3@team/stable,那conanfile.txt里就得写[requires] mylib/1.2.3@team/stable - 若用
conanfile.py,requires = "mylib/1.2.3@team/stable",不能省略@team/stable - CI 中执行
conan search "mylib*" -r artifactory可确认包是否存在、命名是否精确
最容易被忽略的是:Conan 的 remote URL 路径和权限模型强耦合,Artifactory 的 virtual repo 若没把 local + remote repo 都加进聚合列表,或者权限没给到 CI 账号的 read 权限,conan install 就会卡住几秒后直接跳过——它不会报 403,而是当“包不存在”。











