运行 composer show --tree 可列出所有已安装包(含传递依赖),默认 composer show 仅显示顶层声明包;查反向依赖用 composer why package/name,查包自身依赖用 composer show vendor/package 或 --remote 预览。

直接运行 composer show 就能看到已安装包列表,但默认只显示你手动 require 的顶层包——不是全部,也不是依赖树。
怎么列出所有已安装的包(含传递依赖)
很多人以为 composer show 会输出 vendor/ 下所有包,其实它默认只展示 composer.json 中 require 和 require-dev 里声明的包,不展开任何子依赖。
- 要看真实安装了哪些包(包括 guzzlehttp/psr7、psr/http-message 这类“看不见”的底层包),必须加
--tree:composer show --tree - 输出几百行很常见,别硬扫;想快速定位某个包,用管道过滤:
composer show --tree | grep -A 1 -B 1 "guzzle" - 如果
vendor/目录不存在(比如刚 clone 项目还没composer install),所有show命令都会报错或返回空,先装再查
怎么查“谁在依赖某个包”
例如发现项目里有 monolog/monolog,但不确定是自己写的还是被 laravel/framework 拉进来的,用 composer why 最准。
- 命令格式严格:必须写全名,小写+斜杠,
composer why monolog/monolog,写成Monolog或monolog都会报Could not find package - 返回
No dependencies exist for monolog/monolog?说明它可能只在require-dev里,且当前没装 dev 包(比如用了--no-dev安装) - 想看完整链路(比如 A → B → C → monolog),
composer why --tree monolog/monolog,但注意:如果某层用了provide(如psr/log),解析会中断,这不是 bug,是 Composer 的虚拟包机制
怎么查一个包自己依赖了哪些包
分两种情况:包已安装,或只是想看远程注册信息。
- 已安装:直接
composer show vendor/package-name,输出里的requires字段就是它声明的直接依赖(不递归) - 未安装但想预览:加
--remote,比如composer show --remote --direct guzzlehttp/guzzle,能立刻看到它 require 了哪些包,不用先下载 - 注意版本字段歧义:
^7.0是约束,7.5.1才是实际安装版本;要确认真实版本,得看composer show --tree vendor/package-name的第一行
全局包和导出清单的实用技巧
全局安装的工具(如 laravel/installer)不会出现在项目 composer show 结果里,容易漏看。
- 查全局:用
composer global show,同样支持--tree和--direct - 导出纯文本清单备查:
composer show --name-only --installed > deps.txt,--name-only去掉描述,--installed确保只列真正装上的 - 别用
composer depends查反向依赖——它在旧版 Composer 行为不一致,新版推荐统一用composer why,更稳定
真正容易被忽略的是:所有 show 类命令反映的都是当前 vendor/ 和 composer.lock 的快照,不是 composer.json 的理想状态。删了 vendor/ 再跑 composer show,结果就全空了——它不读锁文件,只读已安装结构。











