composer show 默认只显示直接依赖;需加 --tree 查完整依赖树,--installed 确认是否真安装,指定包名查详情,global 包须用 composer global show。

composer show 默认只显示“直接依赖”,不是全部已安装包
很多人运行 composer show 后发现列表比 vendor/ 里少很多,以为漏装了——其实它默认只列出 composer.json 中 require 和 require-dev 明确声明的包,不递归展开间接依赖(比如 monolog/monolog 依赖的 psr/log 就不会出现)。
- 想确认某个包是否真被装进
vendor/,不能只信默认输出,得加--installed或--tree -
composer show不检查vendor/实际文件,而是读composer.lock里的已解析结果;如果执行过composer install --no-install或锁文件损坏,结果可能和磁盘不一致 - 没在项目根目录(即含
composer.json的目录)下运行,会报错或显示全局环境内容,容易误判
查看完整依赖树:用 composer show --tree,别用 composer show 直接扫
要真正看清“哪些包实际落到了 vendor/”,--tree 是最可靠的方式。它按层级缩进展示所有已安装包及其依赖关系,结构清晰,也方便定位冲突源头。
- 输出太长时,直接管道过滤:
composer show --tree | grep "psr/log"查某依赖是否存在、被谁引用 - 注意:
--tree会包含require-dev中的包(除非你加了--no-dev),而composer install --no-dev后它们其实没装——所以判断“是否真存在”,还得结合你的安装命令上下文 - 某些包可能被多个路径引用(如 A → B → C,D → C),
--tree只显示第一个路径,不代表 C 没被其他方式加载
查单个包版本和细节:用 composer show vendor/package,别只看列表
光知道包名和版本号不够,排查问题常需确认它依赖谁、用什么自动加载规则、作者是谁、许可证是否合规——这些都得靠指定包名触发详细视图。
- 加
-i(--interactive)能结构化输出关键元数据:composer show -i monolog/monolog会分段显示name、require、autoload等字段 - 加
-vvv可看到依赖解析过程,比如为什么装的是2.10.0而不是3.x,适合调试版本冲突 - 如果包没装上但你想查远程最新版信息,加
--remote:composer show --remote laravel/framework,但它不会告诉你本地有没有
区分本地 vs 全局:composer global show 不是 composer show --global
全局安装的工具(如 laravel/installer、phpunit/phpunit)不在项目 vendor/ 下,也不会出现在 composer show 结果里——必须显式调用 global 子命令。
-
composer global show查全局包;composer global show --direct只显示你手动global require过的,不包括其依赖 - 全局包的
vendor/在用户主目录(如~/.composer/vendor/),路径和权限跟项目级不同,误用composer show会完全找不到它们 - 没有
composer show --global这种写法,那是无效命令,会报错
最容易被忽略的一点:composer show 的输出受当前工作目录和 COMPOSER_HOME 环境变量影响,跨项目检查时务必确认 pwd 和 composer 配置是否干净——否则看到的可能是隔壁项目的缓存或全局配置。










