Composer本身不提供composer tree或composer graph命令,报错“Command not defined”是因官方未实现;可靠方案只有内置composer show --tree查文本依赖树,或用Graphviz等外部工具导出渲染成图。

Composer 本身不生成图形化依赖图,所有“可视化”方案都依赖外部工具或数据导出;真正开箱可用的只有 composer show --tree 文本树,它不是图,但足够诊断 90% 的依赖问题。
为什么 composer tree 和 composer graph 都会报错
这两个命令根本不存在于 Composer 2.0+ 官方实现中。Command "tree" is not defined 或 Command "graph" is not defined 不是配置错误,是官方没写——别在文档里反复翻找。历史插件(如旧版 hirak/prestissimo)曾提供 composer tree,但与当前 Composer 不兼容,强行安装反而可能导致 composer update 失败。
可靠路径只有两条:
– 用内置 composer show --tree 查文本结构
– 用第三方工具导出数据再渲染成图
-
composer show --tree输出的是缩进文本,每级缩进 = 一层直接依赖,不是美观排版,是解析逻辑的忠实反映 - 缩进相同层级重复出现同一包(如
symfony/console在 2 级和 4 级都出现),大概率意味着多路径引入,版本不一致时就是冲突源头 - 终端宽度太小会导致换行错位,建议搭配
less -S:composer show --tree --no-dev | less -S
composer show --tree 的实际使用边界
它只展示 composer.lock 中已解析出的实际依赖,不是 composer.json 的声明式依赖。这意味着:
立即学习“PHP免费学习笔记(深入)”;
- 未安装的包(
composer show --tree foo/bar对未 install 的包)会报Package not found -
--no-dev是刚需,尤其上线前审查——很多冲突来自phpunit或nikic/php-parser拉入的旧版symfony/polyfill - 不显示版本号,只列包名;查具体版本得单独执行
composer show vendor/package - 想聚焦某条链?直接指定包名:
composer show --tree guzzlehttp/guzzle,它从 Guzzle 开始向下展开,而非扫全量
真正能出图的方案:Graphviz + composer-unused 或 composer-dependency-graph
图形化不是为了好看,而是当文本树超过千行、嵌套深度 >6、多个包从不同路径引入同一依赖时,靠人眼数空格已不可靠。此时必须导出为图。
两个主流选择:
-
composer-unused:扫描vendor/和代码引用,生成反向依赖图(箭头 A → B 表示 B 用了 A)。默认不包含私有包,需加--scan-path手动指定本地path类型仓库 -
composer-dependency-graph(markuspoerschke/composer-dependency-graph):基于composer.lock生成正向依赖图,支持 HTML 交互视图,但需系统已安装 Graphviz(dot -V要能输出版本) - 无论哪种,都要注意
dot命令方向:默认箭头是「被依赖」方向,若要「依赖」方向(A → B 表示 A 依赖 B),得加--reverse参数 - 大项目图太密?用
--filter="laravel/*"或--max-depth=2限制范围,别一上来就全量渲染
循环依赖卡死时,composer show --tree 怎么帮上忙
Composer install 卡住不动、CPU 暴涨、无任何错误输出,极可能是强循环依赖(A → B → A)。这时不能等报错,要主动排查:
- 运行
composer show --tree --no-dev --ignore-platform-reqs,模拟真实安装上下文 - 人工扫描输出中是否出现同一包在不同缩进层级反复出现,且彼此 require 版本范围重叠(如 A v1.3 require B ^2.1,B v2.1.0 require A ^1.2)
- 别信
composer validate—— 它只校验 JSON 格式,完全不检查依赖逻辑 - 也别依赖
composer depends,它只查直接上游,对间接循环无效
真正容易被忽略的是:composer show --tree 的结果严格依赖 composer.lock 是否最新。如果锁文件过期,看到的树和线上环境就不一致——每次运行前先确认 composer install 或 composer update 已成功执行。



















