composer graph 命令需先安装第三方包 baethon/composer-graph 并配置 Graphviz;依赖 vendor 和 composer.lock 完整,支持 --no-dev、--max-depth、--filter 等参数控制输出,但图仅反映声明依赖,不体现自动加载顺序。

composer graph 命令不存在?先装工具再配环境
直接运行 composer graph 报错 Command "graph" is not defined,不是你记错了命令,是这个功能压根没内置在 Composer 里。它来自第三方包 baethon/composer-graph,必须手动全局安装。
装完还不能立刻用:该工具依赖系统级的 dot 命令(Graphviz 渲染引擎),缺了就会报 Dot command not found。
- macOS:运行
brew install graphviz,别只装 PHP 扩展 - Ubuntu/Debian:
sudo apt install graphviz - Windows:去 Graphviz 官网下载安装包,安装时务必勾选「Add Graphviz to the system PATH」
- 全局装工具:
composer global require baethon/composer-graph,确保~/.composer/vendor/bin在你的$PATH中
生成依赖图时输出为空或报错?检查 vendor 和 lock 文件状态
composer graph 不读 composer.json,它解析的是已安装结构——也就是说,vendor/ 目录必须存在且完整,composer.lock 也得是最新状态。如果刚初始化项目、还没跑过 composer install,图就画不出来,连警告都不会给,直接静默失败。
- 先确认:
ls vendor/autoload.php能否成功执行 - 再验证:
composer validate看composer.json是否语法合法 - 若依赖被删过但
composer.lock没更新,运行composer update --lock强制同步锁文件 - CI 环境中常因缓存导致
vendor/不全,建议加一步composer install --no-interaction --prefer-dist再绘图
图太密看不清?用参数控制渲染粒度
默认 composer graph 会把所有包(包括 require-dev)全画进去,Laravel + Symfony 生态下动辄上百节点,连线交叉成蜘蛛网。这不是图错了,是信息过载。
- 排除开发依赖:
composer graph --no-dev - 限制深度,聚焦主干:
composer graph --max-depth=2 - 只画特定命名空间:
composer graph --filter="laravel/*"或--filter="symfony/.*" - 导出为 SVG 而非 PNG:
composer graph --format=svg --filename=deps.svg,方便浏览器缩放查看细节 - 想查某包被谁拉进来?不用翻图,直接用
composer depends guzzlehttp/guzzle更快
为什么图里显示 A → B,但实际类加载却绕过了 B?autoload 顺序不等于依赖图
依赖图展示的是「谁声明了谁」,而自动加载行为取决于 vendor/autoload.php 中注册的 loader 顺序,两者完全解耦。常见陷阱是:两个包都提供了 Helper 类,图上看起来 A 依赖 B,但 B 的 PSR-4 映射被后注册,结果 A 自己的 src/Helper.php 反而生效了。
- 调试真实加载链:
var_dump(spl_autoload_functions())放在入口文件最前 - 固定顺序的方法:
composer dump-autoload -o生成 classmap,它优先于 PSR-4 - 检查冲突点:
composer show -t | grep "Helper"看是否有同名类被多个包声明 - 图只是静态快照,真正影响运行的是
autoload和autoload-dev的合并结果,不是箭头方向
依赖图不是万能解药,它不反映 autoloader 注册时机、不体现运行时条件加载、也不校验版本约束是否真能收敛。画图前先想清楚:你想解决的是结构问题,还是加载行为问题?后者得回代码里查 autoload.php 和 spl_autoload_register 调用栈。











