composer show 显示已安装包及其版本,加 --tree 参数可查依赖关系树;composer depends 专查某包被谁依赖,结果仅含直接依赖者,不追溯全链路。

composer show 能查到哪些依赖信息
直接用 composer show 会列出当前项目所有已安装的包及其版本,但它不显示依赖关系图。真正要查“谁依赖了谁”,得加 --tree 或 -t 参数——这是最常被忽略的开关。
-
composer show -t:从 root(你的项目)开始,展开每一层依赖树,层级缩进表示依赖深度 -
composer show -t <code>monolog/monolog:只查指定包的反向依赖(即哪些包依赖了它),适合排查“这个包为什么被装进来” - 不加
-t时,composer show <code>vendor/package只显示该包自身的元信息(如 description、require 列表),但不会递归展示它依赖了谁
composer depends 查特定包的上游依赖者
如果你只想快速知道“哪个包把 symfony/polyfill-php81 拉进来的”,composer depends 是更精准的命令。它只回答“谁依赖了我”,不关心下游。
-
composer depends <code>symfony/polyfill-php81:列出所有直接或间接依赖它的包(含 dev 依赖) -
composer depends --no-dev <code>guzzlehttp/guzzle:排除开发依赖,聚焦生产环境真实依赖链 - 注意:这个命令在 Composer 2.2+ 才默认可用;旧版本会报错
Command "depends" is not defined,需升级 Composer 或改用composer show -t配合人工扫描
依赖树太深看不清?用 grep 或 --format 过滤
大型项目跑 composer show -t 输出可能几百行,关键路径容易淹没。别硬盯终端,用管道过滤更高效。
-
composer show -t | grep -A5 -B5 <code>laravel/framework:上下各 5 行上下文,定位它在树中的位置 -
composer show -t --format=json | jq '.[0].requires':输出 JSON 后用jq提取 require 字段(需安装jq) - Windows 用户注意:
grep在 PowerShell 里是Select-String,CMD 下基本不可用,建议用 Git Bash 或 WSL 执行
为什么 composer why 和 composer depends 结果有时不一致
composer why 是 composer depends 的别名,两者行为完全相同——但很多人误以为 why 会显示“为什么装了这个包”的完整推理链(比如某插件要求 A,A 要求 B,B 要求 C)。实际上它只返回直接依赖者,不自动追溯源头。
- 例如:你的
phpunit/phpunit依赖sebastian/exporter,而sebastian/exporter又依赖sebastian/recursion-context。执行composer why <code>sebastian/recursion-context只会显示sebastian/exporter,不会提phpunit - 要看到全链路,必须手动从
sebastian/exporter再执行一次composer why,或者用composer show -t一次性展开整棵树 - 另一个坑:如果包是通过
replace或provide被间接满足的(比如psr/log被monolog/monolog提供),composer why可能不显示任何结果,因为 technically 没有“直接 require”
composer depends 锁定入口,再用 composer show -t 展开验证,比单靠一个命令更可靠。树状结构本身不复杂,但 Composer 对 dev 依赖、conflict 规则、平台包(如 ext-curl)的处理会让输出含义变微妙——别只看缩进,一定结合 composer.json 里的 require 和 require-dev 字段交叉核对。


















