conan info 命令可查包的来源远程信息,其输出中的 remote 字段来自本地缓存中 metadata.json 文件,是唯一权威来源;该字段首次下载时写入,后续不自动更新,也不随远程配置变更而同步。

conan info 能查到包的来源路径和远程信息
Conan 本身不“记住”某个包最初是从哪个远程下载的,但它会在本地缓存中记录该包的 remote 字段 —— 这个字段是在首次下载时写入的,后续不会自动更新。执行 conan info 是最直接的验证方式:
-
conan info fmt/10.2.1@显示基础元信息,但不含远程来源 -
conan info fmt/10.2.1@ --graph=graph.dot会生成依赖图,其中每个节点带remote属性(如conan-center或my-company-repo) - 更轻量的方式:
conan search fmt/10.2.1@ -r=all列出所有远程中是否匹配该引用,但不说明本地包实际来自哪一个
注意:conan search 只查远程索引,不是查本地包来源;真正可靠的只有 conan info 输出里的 remote 字段。
本地包缓存目录里藏着 remote 标识文件
Conan 2.x 的本地缓存结构中,每个已安装包在 ~/.conan2/p/b/<hash>/metadata.json 里明确存有 "remote": "conan-center" 字段。这个文件是 Conan 运行时读取的权威来源,不是靠猜测或路径推断。
- 路径示例:
~/.conan2/p/b/abc123xyz456/metadata.json - 该文件由
conan install或conan download下载时写入,之后不会随远程配置变更而自动刷新 - 如果手动删掉这个文件,
conan info就会显示remote: None,即使包还在缓存里
conan install 时加 --remote 才能强制指定来源
默认情况下,conan install 会按 conan remote list 中的顺序遍历远程,找到第一个匹配的包就停止。它不会“比较多个远程的同名包”,也不会自动选“最新”或“最近”。这意味着:
- 如果你同时在
conan-center和私有仓库my-team都有fmt/10.2.1@,conan install用的是列表排第一的那个 - 要确保从特定远程拉取,必须显式加
--remote=my-team参数 - 没加
--remote时,即使你刚conan remote remove conan-center,只要之前缓存过,conan install仍可能复用本地已有包(不报错也不提醒)
容易被忽略的脏状态:remote 字段不会自动同步
这是最常踩的坑 —— 当你把一个包从 A 远程下载后,又把 A 远程删了、改名了,或者换了一个同名包在 B 远程里更新了版本,Conan 不会自动修正本地包的 remote 字段。它就静静地躺在 metadata.json 里,指向一个早已不存在的 remote 名称。
这种情况下,conan info 仍显示旧 remote,conan upload 却会失败(因为 remote 找不到),而 conan search -r=xxx 又查不到——三者行为不一致,容易误判。唯一稳妥的做法是:需要确认来源时,始终以 conan info 输出为准,并留意其 remote 是否仍在 conan remote list 中存在。


















