唯一稳定可用的命令是composer show -t(2.5+)或composer show --tree(2.0–2.4),必须基于已安装状态查;精准聚焦需严格使用-t前加--no-dev、指定包名或点号,超200行或嵌套>6层时应转graphviz可视化。

直接结论:别用 composer tree 或 composer depends,它们要么不存在、要么默认禁用且不可靠;唯一稳定可用的命令是 composer show -t(Composer 2.5+)或 composer show --tree(2.0–2.4),但二者本质是同一功能,且必须基于已安装状态查 —— 没装进 vendor/ 就看不到。
为什么 composer show -t 输出缩进容易看错
缩进只表示 require 声明层级,不是加载顺序,也不是调用链。比如 guzzlehttp/guzzle 下缩进出现 psr/http-client,说明 Guzzle 的 composer.json 明确写了它;同一包在 2 级和 4 级都出现,大概率被不同上游包分别引入,版本不一致时就是冲突前兆。
- 把缩进当“类加载顺序”是常见误解 —— 真正起作用的是
vendor/autoload.php里 PSR-4/classmap 的注册顺序 - 终端宽度不够会导致换行错位,缩进视觉混乱:建议加
| less -S或重定向到文件后查看 - 看到某包重复出现 ≠ 版本冲突 —— 得配合
composer show guzzlehttp/guzzle确认实际安装版是否一致
怎么精准聚焦某条依赖路径
全量输出动辄上千行,不加过滤等于无效。关键参数顺序和写法必须严格:
- 查整个项目:用
composer show -t .(点号不能省,.代表当前项目) - 只看生产环境链路:
composer show --no-dev -t .(--no-dev必须放在-t前面,否则被忽略) - 查某个包的下游依赖:
composer show -t guzzlehttp/guzzle(从 Guzzle 向下展开,不扫全量) - 查未安装包的潜在依赖:
composer show --remote -t monolog/monolog(适合安装前评估)
注意:composer show -t 读的是 vendor/ 和 composer.lock 的真实快照,不是 composer.json 的理想状态 —— 改了 composer.json 但没 update,树还是旧的。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
如何反向查“谁用了这个包”并溯源到自己项目
composer depends 是实验功能(2.4+ 默认关闭),遇到 provide、replace 或本地 path 仓库时极易漏判。真正可靠的是:
-
composer show --who psr/log:列出所有直接require了它的已安装包 -
composer show --who --no-dev psr/log:过滤掉开发依赖,聚焦运行时真实引用者 -
composer why --tree monolog/monolog:必须加--tree,否则只返回一级上游(如laravel/framework),看不到源头是不是你自己的composer.json
输出末尾出现 your-project-name dev-main 才算确认是你自己写的 require;若结尾带 [dev],说明来自 require-dev;若中断在中间(比如停在 symfony/console),大概率是它通过 provide psr/log 虚拟声明,没继续解析下去。
什么时候必须上 Graphviz 可视化
当 composer show -t 输出超过 200 行、同一包在多个深度反复出现、或嵌套层级 > 6 时,纯文本树形结构已失去可读性 —— 这不是你眼花,是工具设计如此。
- 先装
graphviz:brew install graphviz(macOS)、sudo apt install graphviz(Ubuntu)、Windows 下官网安装并勾选 “Add to PATH” - 再装可视化插件:
composer global require baethon/composer-graph - 最后生成图:
composer graph --format=png --output=deps.png
可视化图能暴露隐藏的循环引用、重复实现(如多个包都 provide psr/log-implementation)、以及被高版本降级却未察觉的包 —— 这些在文本树里极难定位。










