不能,conan info .. 输出扁平化列表并标注via字段,需人工拼接;完整依赖树需用conan info .. --graph=file.html生成可交互HTML图,或解析conan.lock中的graphs节点。

conan info .. 能看到完整依赖树吗
不能直接看到“树形缩进”的可视化结构,conan info .. 输出的是扁平化的节点列表,每个包一行,但会标注其父依赖(via 字段),需要人工拼接。它适合快速确认某个包是否被引入、由谁引入,不适合一眼看清嵌套层级。
真正能反映依赖拓扑关系的,是 conan info .. --graph=file.html 生成的 HTML 文件——它用有向图展示所有包及其依赖箭头,点击节点可展开/收起子树,支持搜索和高亮,是分析复杂依赖最直观的方式。
-
conan info ..:适合 CLI 快查,比如确认zlib/1.2.13是否被openssl/3.0.10拉入 -
conan info .. --graph=file.html:必须用,尤其当requires超过 3 层或存在共享依赖(如多个库都依赖zlib)时 - 注意:HTML 图中相同包名但不同
settings(如build_type=DebugvsRelease)会被视为不同节点——这是 Conan 的设计,不是错误
为什么 conan search 不显示传递依赖
conan search 只查本地缓存里“已安装的包”,不管它们是谁拉进来的。它不解析依赖关系,也不读取 conanfile.py 或 conan.lock。所以即使 poco/1.12.4 依赖 zlib/1.2.13,你运行 conan search zlib/1.2.13@ 成功,不代表这个 zlib 是当前项目用到的那个——它可能来自另一个项目的残留。
真正属于当前项目的传递依赖,只存在于 conan.lock 文件中。这个文件是 conan install 运行后生成的,记录了整棵依赖树的精确版本、settings 和 options。
- 查“项目实际用了哪些传递依赖”:打开
conan.lock,看graphs下的nodes列表,每个 node 都带ref和depends字段 - 查“某个包在当前 lock 中是否被使用”:用
grep -A5 "zlib/1.2.13@" conan.lock - 别依赖
conan search做依赖审计——它和你的项目无关,只和本地磁盘有关
conan install --dry-run 能预览依赖树吗
不能。conan install 没有 --dry-run 参数(v2.x 版本不支持)。想预览又不想污染本地缓存,正确做法是用 conan lock create . 先生成 conan.lock,再用 conan info 或 conan graph 分析它。
这个流程才是安全的:修改 conanfile.py → conan lock create . → 检查 conan.lock 或 conan info --lockfile=conan.lock .. → 确认无误后再 conan install --lockfile=conan.lock。
-
conan lock create .不下载任何包,只做依赖解析和版本决策,速度极快 -
conan info --lockfile=conan.lock ..会基于 lock 文件输出依赖信息,比直接conan info ..更准确(不受本地已安装包干扰) - CI 脚本里应强制走 lock 流程,避免开发机和构建机因缓存差异导致依赖不一致
依赖树里出现重复包名但版本号一样,正常吗
正常,但要警惕 settings 差异。Conan 把 zlib/1.2.13 + build_type=Debug 和 zlib/1.2.13 + build_type=Release 视为两个完全不同的包,即使版本字符串一模一样。
这种“同名不同构”在混合构建场景下很常见,比如你的项目同时构建 Debug 和 Release 目标,或者某个依赖强制要求静态链接而另一个要求动态链接。问题不在重复,而在你是否真的需要两套二进制。
- 检查重复节点的
settings字段(HTML 图里鼠标悬停可见,conan.lock里每个 node 都有settings字典) - 如果只是调试需要,可以接受;但如果上线构建里也保留 Debug 包,会增大镜像体积且增加维护成本
- 更干净的做法:用
conan profile统一约束build_type,或在conanfile.py里加default_options = {"*:shared": True}减少变体爆炸
--graph 或 conan.lock 手动拆解——没有一键“简化树”的魔法命令,这点容易被忽略。


















