composer show 默认只显示顶层依赖,非全部已安装包;需加 --installed 或 --tree 才能查看 vendor/ 中真实存在的所有包,因其默认仅解析 composer.lock 的顶级 packages 字段,跳过间接依赖。

composer show 是查已安装包版本的唯一可靠命令,但它默认只显示你手动 require 的顶层包,不是 vendor 里真实存在的全部包——想看到磁盘上实际装了什么,必须加 --installed 或 --tree。
为什么 composer show 输出比 ls vendor/ 少很多
它默认只读 composer.lock 中的 packages 字段,跳过所有间接依赖(比如 symfony/console 拉进来的 psr/log)。你手动写在 composer.json 的 require 和 require-dev 才会出现在默认输出里。
- 常见错误现象:
composer show返回空或只有三五个包,但ls vendor/里有几十个目录——这不是漏装,是命令行为如此 - 执行前确认已在项目根目录(含
composer.json和vendor/) - 确保已运行过
composer install或composer update,否则composer.lock或vendor/composer/installed.json可能缺失 - 若用过
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解析结果;锁文件损坏会导致输出与磁盘不一致
composer show --installed --no-ansi 导出干净列表
需要一行一个 vendor/name version 的纯文本格式,用这个组合最稳:
-
--installed强制只输出已安装的包(跳过composer.json里写了但没 install 的) -
--no-ansi去掉颜色和控制字符,避免重定向到文件时混入乱码 - 等价短命令:
composer show -i --no-ansi(-i = --installed) - 只要包名不要版本:
composer show --installed --no-ansi | awk '{print $1}' - 想 JSON 格式?
--format=json可用,但嵌套结构解析成本高,日常推荐--format=plain
查单个包是否真装上了,别用 composer list
composer list 是列出所有可用命令的,不是查包用的。加 --format=json 只会让命令列表以 JSON 输出,跟依赖毫无关系——这是新手常搜错关键词导致的误操作。
- 查某个包是否已安装:
composer show vendor/package(如composer show monolog/monolog) - 包名大小写敏感:
symfony/console和Symfony/Console是两个不同包,输错就查不到 - 查全局包别用
composer show,得用composer global show;它不依赖当前路径,直接读~/.composer或%APPDATA%\Composer - 确认是否真装上了:
composer global show laravel/installer,而不是composer show laravel/installer
真正容易被忽略的是:所有 composer show 行为都基于 vendor/composer/installed.json 这个快照文件,不是实时扫描 vendor/。如果这个文件损坏或被手动删改,输出就会和磁盘内容不一致——遇到奇怪结果,先检查它是否存在且可读。

















