Composer 官方无 graph/viz 命令;show --tree 仅为缩进文本,非可视化工具;可靠方案是 show --format=json --recursive 转 DOT 后用 Graphviz 渲染,或装 markuspoerschke/composer-dependency-graph 快速生成 HTML/PNG。

Composer 没有内置的 composer graph 或 composer viz 命令,所有试图运行这些命令报出的 Command "graph" is not defined 都不是你配错了,是官方根本没实现。
为什么 composer show --tree 看着像图,其实不是可视化工具
它只是带缩进的纯文本输出,缩进代表直接依赖层级(每级通常是两个空格),但不带版本号、不区分 require 和 require-dev、也不过滤 dev- 分支或 self.version 占位符。常见误读包括:
- 把同一包在不同缩进深度重复出现,当成“冗余”,其实是被多个上游包分别引入——这时才真要警惕版本冲突
- 用
composer show --tree guzzlehttp/guzzle查子树时,忘记加--no-dev,结果混入phpunit拉进来的旧版symfony/polyfill - 终端宽度太小导致换行错位,缩进对不齐,建议固定宽屏 +
less -S:composer show --tree --no-dev | less -S
用 composer show --format=json --recursive 导出数据再转 DOT
这是 CI/CD 或脚本化生成图的可靠路径,可控性强,不依赖 PHP 插件。关键点在于:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
composer show --format=json默认只返回 root 的直接依赖;必须加--recursive才展开全量,但要注意循环依赖可能卡住 - 输出 JSON 中的
require和require-dev是分离字段,可按需过滤,避免 dev 包污染生产依赖视图 - 转 DOT 时必须剔除非法标识符:如
dev-master、self.version、含斜杠的别名(vendor/name[dev-feature])——否则dot会报syntax error in line X - 渲染前确认 Graphviz 已就绪:
dot -V要能输出版本;常用命令:dot -Tpng composer-deps.dot -o deps.png
装 markuspoerschke/composer-dependency-graph 快速出 HTML/PNG
适合本地临时排查,封装了 DOT 生成、去噪、调用 dot 全流程,还支持交互式 HTML 视图。安装和使用极简:
- 全局安装:
composer global require markuspoerschke/composer-dependency-graph - 项目内生成 PNG:
composer graph --filename=deps.png --format=png - 生成可点击 HTML:
composer graph --filename=index.html --format=html - 注意:它默认包含
require-dev,如需精简,得配合--no-dev参数(部分旧版不支持,建议用 v2.0+)
真正难的不是生成一张图,而是读懂图里那些重叠节点、交叉边、孤立子图——它们往往对应着隐性耦合、废弃包残留、或被锁死的旧版 polyfill。别让可视化变成装饰,重点看谁在拉低 Symfony 版本,谁在偷偷 require 全局 autoload 的扩展包。

















