当前唯一稳定可用的依赖树命令是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 的位置不能颠倒:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
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 的当前快照,不是你的意图。










