composer-unused 配合 graphviz 可生成反向依赖图,支持 --reverse 调整箭头方向,但需手动处理私有包路径。

composer dependents 命令不显示依赖图,得换工具
Composer 自带的 composer show --tree 只能看当前项目的依赖树,没法反向查“谁依赖了这个包”,更不能生成可视化图。想看某个包(比如 monolog/monolog)被哪些其他包间接或直接引用,必须借助第三方插件。
用 graphviz + composer-unused 插件生成依赖图
推荐用 composer-unused 配合 Graphviz 渲染,它能扫描整个 vendor 目录,识别实际被 require 的包,并导出为 .dot 文件。注意:它默认只分析“被代码引用”的包,不是单纯看 composer.json 里的声明。
- 先全局安装:
composer global require composer-unused/composer-unused - 生成 dot 文件:
composer-unused --format=dot > deps.dot - 用 Graphviz 渲染:
dot -Tpng deps.dot -o deps.png - 如果提示
Command 'dot' not found,说明没装 Graphviz,macOS 用brew install graphviz,Ubuntu 用apt install graphviz
graphviz 输出图里箭头方向容易误解
Graphviz 默认画的是“被依赖方向”:箭头从 A → B 表示“B 依赖 A”,也就是 A 是被 B 用的。这点和日常说的“依赖关系”语序相反,很多人第一眼会读反。比如图中 laravel/framework → symfony/console,意思是 Laravel 框架用了 Symfony 控制台组件,不是反过来。
- 想改成“依赖方向”(即 A → B 表示 A 依赖 B),得加
--reverse参数:composer-unused --format=dot --reverse > deps.dot - dot 文件里节点名默认是包名全称(含 vendor 名),但不带版本号;如果要区分版本,得改用
composer-show-dependencies插件,但它不支持 dot 导出 - 大项目生成的图可能太密,建议先限定范围:
composer-unused --include="monolog/monolog" --format=dot
别指望 composer.lock 或 vendor/autoload.php 自动生成完整依赖图
composer.lock 只记录最终解析出的包版本和哈希,没有依赖路径信息;vendor/autoload.php 是运行时加载器,也不含结构关系。硬解析这些文件写脚本,既不可靠又难维护——已经有现成工具,没必要重复造轮子。
真正麻烦的是私有包或 path repo:如果本地开发用 "type": "path" 引入未发布包,composer-unused 默认跳过它们,得加 --scan-path 手动指定目录。这点很容易漏,图一出来就缺关键节点。










