composer show -i 仅列出 vendor/ 目录中实际存在的包,不读取 composer.json 或 composer.lock,也不显示 platform 配置;指定包名可精确验证安装状态,输出反映当前 vendor 快照。

composer show -i 真实作用:只看 vendor/ 里“真装了”的包
composer show -i 不是读 composer.json 的声明,也不是查 composer.lock 的记录,它只扫描 vendor/ 目录下实际存在的包目录。哪怕你在 require-dev 里写了 "phpunit/phpunit": "^10",但没运行过 composer install --dev,它就不会出现在输出里。
- 必须在项目根目录(含
composer.json和vendor/)执行,进错子目录(比如vendor/monolog/monolog)会报Could not find package - 如果整个
vendor/被删了,命令会静默无输出,或提示找不到包——不是 bug,是它真的没东西可列 - 不显示
config.platform模拟的扩展(如"ext-gd": "1.0"),那些只是“假装装了”,show -i无视它们
怎么快速确认某个包是否装对了版本?
别只信 composer show -i | grep xxx —— 它可能匹配到包名、描述甚至依赖项。最稳的方式是直接指定包名:
composer show -i monolog/monolog
这会精确匹配 vendor/monolog/monolog/ 目录,并输出它的版本、License、源地址(-s 可加)、依赖树(如有)和 autoload 配置。注意:monolog/monolog 必须和目录名完全一致,大小写敏感,不能写成 Monolog/Monolog 或 monolog。
- 若输出 “Package not installed”,说明它不在
vendor/里,哪怕composer.lock有记录也没用 - 想脚本化判断(比如 CI 中),用
test -d vendor/monolog/monolog比调composer show更快更轻量 - 加
-vvv(如composer show -vvv monolog/monolog)能看到安装路径、解析时用的仓库、甚至 PHP 版本约束求解过程,适合调试冲突
show -i 和 show --tree 的关键区别:你到底想看“谁装了”,还是“谁被谁装了”
composer show -i 列的是“已安装包的平铺清单”,每个包一行;而 composer show --tree 展示的是“依赖关系图”,能看出 laravel/framework 是因为 laravel/tinker 而间接装了 symfony/console。
- 要检查是否有多版本共存(比如两个不同
guzzlehttp/guzzle),show -i更直观——它只列最终落地的那一个 - 要定位为什么某个旧版包被拉进来,
show --tree vendor/package才能顺藤摸瓜找到上游依赖 -
show -i不支持--tree,加了也无效;反过来,show --tree默认只显示顶层依赖,得加包名才展开子树
别用 show -i 查 Composer 自身或项目 version 字段
composer show -i 和 composer show --self 完全无关:show -i 查 vendor,show --self 查当前项目的 composer.json 元数据。而且 show --self 几乎从不显示 version 字段——即使你写了 "version": "1.2.3",Composer 也认为 root package 没有“固定版本”,除非打 Git tag 或靠 composer.lock 推断。
- 想知道 Composer 工具本身版本?用
composer --version,它带 commit hash,比show --self可靠得多 - 想确认当前项目“实际发布版本”?看 Git tag 或解析
composer.lock里的packages数组中name匹配 root 的条目 -
show -i输出里永远没有 PHP 版本、扩展状态、平台配置——那些得靠composer show --platform或composer diag
show -i 的输出反映的是此刻 vendor/ 的快照,不是声明,也不是历史。它不告诉你“该不该装”,只告诉你“现在装了啥”。依赖管理里最常出问题的地方,往往就卡在这三者之间的偏差上。










