composer show -t 是查看依赖树的正确命令,. 表示当前项目,--no-dev 必须置于 -t 前,缩进代表直接依赖层级,--who 查谁依赖某包,-t 是 why 显示完整路径的必要选项。

查依赖树,只用 composer show -t,别再写 --tree —— 它在 Composer 2.2+ 已被移除,强行用会报错。
为什么 composer show -t 必须带包名(比如 .)?
因为 composer show -t 不接受空参数。不指定目标,它直接报 Not enough arguments。
-
composer show -t .:查看整个项目的完整依赖树(.表示当前项目) -
composer show -t guzzlehttp/guzzle:只展开 Guzzle 及其下游依赖,跳过无关分支,快且聚焦 -
composer show -t --no-dev .:错误写法 ——--no-dev必须放在-t前面,正确是composer show --no-dev -t .
composer show -t 输出里缩进到底代表什么?
每级缩进 = 一层直接依赖关系。不是视觉装饰,是真实声明路径。
-
guzzlehttp/guzzle下缩进出现psr/http-client,说明 Guzzle 的composer.json明确写了"require": {"psr/http-client": "^1.0"} - 同一包(如
monolog/monolog)在不同缩进深度重复出现,大概率被多个上游包分别引入,版本不一致时就是冲突高发点 - 终端太窄导致换行错位?加
| less -S关闭自动折行:composer show --no-dev -t . | less -S
查“谁在依赖某个包”,别用 depends,改用 composer show --who
composer depends 是实验性命令,默认关闭,遇到 provide、replace 或 path 仓库时容易漏判;而 composer show --who 直接扫描所有已安装包的 require 字段,结果确定、不绕弯。
-
composer show --who monolog/monolog:列出所有直接声明了它的包(比如laravel/framework) - 加
--no-dev过滤掉开发工具链:composer show --who --no-dev monolog/monolog - 结果为空 ≠ 没人用 —— 可能是通过虚拟包(如
psr/log-implementation)间接提供,此时应回头看composer show -t .全局结构
想定位“我自己的 composer.json 哪一行写了它”?必须加 --tree(即 -t)到 why
composer why monolog/monolog 默认只返回一级来源(比如 laravel/framework),根本看不到是不是你主动 require 的。这等于没查。
- 正确命令:
composer why -t monolog/monolog,输出末尾出现your-project-name dev-main,才说明源头在你自己的require - 如果结尾带
[dev],说明来自require-dev - 树在某层中断(比如停在
laravel/framework就没了)?大概率是它用了provide声明虚拟包,没继续向下解析
真正卡住你的往往不是“有没有依赖”,而是“哪个版本被谁锁死”——show -t 只告诉你现状,不解释约束来源。看到多版本共存,立刻补一句 composer why-not vendor/package version 验证升级可行性;怀疑某包被降级,就对它的上游包再跑一遍 composer why,逐层上溯。











