composer show -t 默认只显示顶层依赖而非完整树,因 Composer 2.0 起启用精简模式且默认作用于 root 包;需用 --all 或指定包名(如 monolog/monolog)展开全部传递依赖。

composer show -t 是查看当前项目依赖树的快捷命令,但它默认只显示顶层包(即 composer.json 中直接 require 的包),不会递归展开全部依赖。想看到完整树状图,得加额外参数或调整上下文。
为什么 composer show -t 看不到完整依赖树?
Composer 从 2.0 开始默认启用“精简模式”:仅加载已安装的包元数据,且 show -t 默认作用于 root 包本身(即你的项目),而非整个 vendor 目录。所以你常看到的只是类似:
my/project └── monolog/monolog (2.10.0)
——这其实是项目自身声明的依赖,不是它的子依赖(比如 monolog/monolog 自己还依赖 psr/log、php 等)。
- 不加参数时,
composer show -t等价于composer show -t my/project - 它不自动解析 vendor 下所有已安装包的依赖关系链
- 若某些包未安装(比如
require-dev里没运行install --dev),它们也不会出现在树中
怎么真正显示完整依赖树?
用 composer show -t --all 或指定一个具体包名来展开它的完整依赖链:
-
composer show -t --all:显示所有已安装包(含 dev 依赖)的完整层级树,但输出可能极长,建议配合grep或重定向到文件 -
composer show -t monolog/monolog:只展开monolog/monolog及其全部子依赖(包括传递依赖) - 想看生产环境依赖(不含
require-dev),先确保用composer install --no-dev安装,再运行composer show -t --all - 注意:Composer 2.2+ 支持
--tree别名,composer show --tree和composer show -t效果一致
常见错误和坑
执行后报错或输出异常,大概率是这几个原因:
-
[InvalidArgumentException] Package xxx not found:输入了不存在或未安装的包名,先运行composer show确认包名拼写和是否已安装 - 树里出现
???或版本号为空:该包被replace或provide机制覆盖(如symfony/polyfill-*),实际不占物理依赖位置 - 看不到
require-dev的包:默认composer show不加载 dev 包,除非加--dev或已执行过composer install --dev - Windows 上终端宽度不足导致换行错乱:用
composer show -t --all | more分页,或导出为文本分析
依赖树深度越大,越容易漏掉间接冲突(比如两个不同版本的 psr/container 被不同包引入)。别只盯着第一层,多翻几屏,重点关注重复出现的包及其版本跨度。










