当前唯一稳定可用的依赖树命令是composer show -t,必须指定包名(如.或monolog/monolog),否则报Not enough arguments;--tree在Composer 2.5+中已被彻底移除,使用会提示Unrecognized option "--tree"。

composer show --tree 已在 Composer 2.5+ 中彻底移除,现在唯一稳定可用的命令是 composer show -t,且必须带包名(比如 . 或 monolog/monolog),否则报错 “Not enough arguments”。
为什么 composer show --tree 报错或没输出
不是命令写错了,是环境或参数不满足最低要求:
-
vendor/目录不存在或为空 ——composer install或composer update没执行过,show -t就无数据可读 -
composer.lock缺失、损坏或未同步 —— 它才是依赖解析结果的唯一权威来源,composer.json只是“愿望清单” - 包名输错:大小写敏感、
/不能省、vendor 名不能缩写(monolog/monolog≠monolog) - 用了
--tree但当前是 Composer ≥ 2.5 —— 该选项已被弃用,强行使用会提示Unrecognized option "--tree" - 只写了
composer show -t没跟包名 —— 必须指定,.表示当前项目,topthink/framework表示具体包
composer show -t 的参数顺序和常见组合
参数顺序直接影响结果是否生效,尤其 --no-dev 和 -t 的位置不能颠倒:
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
-
composer show -t .:查看整个项目的完整依赖树(点号不能省) -
composer show --no-dev -t .:只显示生产环境依赖链(--no-dev必须放在-t前) -
composer show -t guzzlehttp/guzzle:从 Guzzle 开始向下展开,聚焦某条路径 -
composer show --no-dev -t monolog/monolog:查某包的下游依赖,且排除 dev 包干扰 -
composer show -t --remote monolog/monolog:不安装,仅查远程仓库中该包声明的依赖(适合安装前评估)
怎么读懂输出里的缩进和括号内容
缩进不是排版装饰,而是明确的依赖层级声明关系:
- 顶行(无缩进)是你
composer.json中直接require的包,比如topthink/framework - 下一级缩进表示它在自己的
composer.json里写了require的包,比如psr/log - 同一包在不同缩进深度重复出现(如一次在 2 级、一次在 5 级)→ 被多个上游包分别引入,版本不一致时就是冲突高发区
- 括号里
[v7.8.1]或[dev-master]是实际安装版本,不是你写的约束;看到v6.5.8但你写了"^7.0"?说明有其他包强制降级了它 - 不显示版本号的包(只列
psr/http-client)需单独运行composer show psr/http-client查真实版本
依赖冲突时 show -t 只能验证,不能诊断
当 composer install 失败并提示版本冲突,show -t 输出的是 lock 文件里“已妥协”的快照,不是你期望的状态:
- 看到
guzzlehttp/guzzle v6.5.8但你写了"^7.0"→ 先跑composer why guzzlehttp/guzzle找谁在拉旧版 - 再跑
composer prohibits guzzlehttp/guzzle:7.*找出具体阻止升级的约束条件 -
show -t不会显示被跳过的候选包,也不会展开因冲突未安装的包 —— 它只反映“最终落地结果”,不是 resolve 过程 - 终端宽度太小会导致缩进换行错位,建议加管道:
composer show -t . | less -S
真正卡住的地方往往不是命令会不会用,而是忘了 composer update 后再查,或者把 composer.json 的修改当成了已生效状态。依赖树永远只忠于 vendor/ 和 composer.lock 的当前快照,不是你的意图。

















