composer show 默认只显示 composer.json 中直接声明的顶层依赖,不包含间接依赖;需用 --tree 查依赖树、-s 查 autoload/scripts、--all 查远程版本,且依赖 composer.lock 和 vendor/ 目录完整性。

composer show 默认只显示 composer.json 里直接写的包,不是 vendor 里真实存在的全部包——想看装了啥、谁依赖谁、有没有冲突,得靠参数组合,不是敲一行命令就完事。
为什么 composer show 输出比 ls vendor/ 少很多
它默认只读 composer.lock 中的顶层 packages 字段,跳过所有间接依赖(比如 symfony/console 拉进来的 psr/log)。你手动写在 require 或 require-dev 里的才会出现在默认输出里。
- 常见错误现象:
composer show返回空或只有三五个包,但ls vendor/里有几十个目录——这不是漏装,是命令行为如此 - 执行前必须确认:已在项目根目录(含
composer.json和vendor/),且已运行过composer install或composer update - 如果用过
composer install --no-dev,require-dev里的包(如phpunit/phpunit)不会出现,哪怕它们还在composer.json里
查完整依赖树:用 composer show --tree
这是唯一能还原真实安装结构、排查版本冲突的方式。输出带缩进和箭头,例如:
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
laravel/framework v10.48.12
└── symfony/console v6.4.7
└── psr/log 3.0.0
- 它严格按当前安装状态展示,不包含被
--no-dev排除的开发依赖 - 终端宽度不够时长包名会被截断,建议加
| less -S或重定向到文件:composer show --tree > deps.tree - 依赖太深?别滚动找,直接
composer show --tree | grep "guzzlehttp" - 注意:该命令不扫描
vendor/目录,完全依赖composer.lock解析结果;锁文件损坏会导致输出与磁盘不一致
导出干净列表给脚本或运维用
需要一行一个 vendor/name version 的纯文本格式,用 --installed --no-ansi 最稳:
-
composer show --installed --no-ansi:强制只输出已安装的包(跳过composer.json里写了但没install的),且去掉颜色和控制字符,避免重定向到文件时混入乱码 - 等价短命令:
composer show -i --no-ansi(-i=--installed) - 只要包名不要版本:
composer show --installed --no-ansi | awk '{print $1}' - 想 JSON 格式?
--format=json可用,但嵌套结构解析成本高,日常推荐--format=plain
查某个包是否真装上了、装的是啥版本
直接输全名,大小写敏感,斜杠不能少:
-
composer show monolog/monolog—— 查具体信息(版本、描述、源地址) -
composer show -s monolog/monolog—— 看 autoload 映射和 scripts 配置(Composer 2.2+ 支持) -
composer show -p—— 显示 PHP 及扩展依赖(如ext-json),常用于排查环境兼容问题 - 包名拼错(比如
monolog漏掉/monolog)会报Package not found,不是命令失效
真正容易被忽略的点是:composer show 不联网、不解析 composer.lock,只读 vendor/composer/installed.json——所以断网也能用,但前提是 vendor/ 目录存在且没被删过;一旦这个文件损坏,输出就不可信。

















