composer show 读取 vendor/composer/installed.json,断网可用但依赖 vendor 目录存在;默认仅显示顶层依赖,需 --tree 查完整依赖树,--direct 限显手动安装包,全局包须用 composer global show。

直接运行 composer show 就能列出已安装包
它不联网、不解析 composer.lock,只读取 vendor/composer/installed.json —— 所以断网也能用,前提是 vendor 目录存在且没被删过。
-
composer show默认只显示你手动写在composer.json的require和require-dev里的包(即“顶层依赖”),不会展开monolog/monolog这类被拉进来的间接依赖 - 如果刚执行过
composer install --no-dev,那require-dev里的包(比如phpunit/phpunit)就不会出现在结果里,哪怕它们还在composer.json中 - 包名大小写敏感:
symfony/console和Symfony/Console是两个不同包,输错就查不到
要看完整依赖树,必须加 --tree
想搞清为什么项目里有 psr/log,或者确认某个包是否被多层嵌套引入,--tree 是唯一可靠方式。
-
composer show --tree输出的是缩进结构,层级清晰,比如:symfony/http-kernel v6.4.7 └── symfony/event-dispatcher v6.4.3 └── psr/event-dispatcher ^1.0 - 它不递归解析,也不校验兼容性,只是静态读取
installed.json中记录的依赖关系 - 配合
grep快速定位:composer show --tree | grep guzzle,但注意有些包名含斜杠,可能需要转义或加引号
导出纯文本清单用于审计或 CI 校验
别手写脚本去解析 composer.lock —— 格式不稳定,Composer 2.x 和 3.x 差异大;用 composer show 自带的格式输出更稳。
- 只要包名+版本,一行一个(适合管道处理):
composer show --format=plain - 导出为带缩进的完整树形文本(供人工审阅):
composer show --format=txt > dependencies.txt - 想只导出你亲手
require的包(不含子依赖):composer show --direct --format=plain
查全局包别用 composer show,得换命令
composer show 只看当前项目,跟全局完全无关;误用会导致“明明装了 laravel/installer 却查不到”。
- 查全局已安装工具:
composer global show,它不依赖当前路径,直接读~/.composer或%APPDATA%\Composer - 确认是否真装上了:
composer global show laravel/installer,而不是composer show laravel/installer - 全局 bin 路径没进
PATH?先跑composer config --global home看目录,再检查[home]/vendor/bin是否在环境变量里
vendor 目录时,所有 composer show 命令都会报错或返回空——它不回退到 composer.lock,也不尝试重装。所以看到空结果,第一反应不是命令错了,而是先 ls vendor 看目录在不在。










