composer show vendor/package-name 直接读取 vendor/composer/installed.json 查当前已安装版本,不联网、不解析 composer.lock,输出中 versions 行即真实生效版本(如 v3.5.0 或 dev-main),大小写敏感且依赖 vendor 目录存在。

直接运行 composer show vendor/package-name 就能查到当前项目里这个包实际装的是哪个版本——它不联网、不解析 composer.lock,只读 vendor/composer/installed.json,所以快且准。
查某个包的当前已安装版本
执行 composer show monolog/monolog,输出中 versions 行就是真实生效的版本,比如 v3.5.0、dev-main 或带 commit hash 的开发版。
- 大小写敏感:
symfony/console和Symfony/Console是两个包,输错就报Package not found - 包只在
require-dev里?如果上次是composer install --no-dev,那它不会出现在结果里 - 刚改了
composer.json但没composer install或update?显示的仍是旧版本,不是缓存问题,是根本没重装 - 路径型本地包(
"type": "path")也会正常显示,show会标出 source 类型和本地路径,别误以为没装上
查远程所有可用版本(含最新 tag 和分支)
用 composer show -a monolog/monolog(-a 是 --all 的简写),它会拉取 Packagist 或你配置的私有源上的全量版本列表,包括 3.5.0、v2.10.0、dev-main、1.2.3-RC1 等。
- 不依赖本地是否已安装该包,也不看你
composer.json里有没有写它 - 拼错包名?直接报
Package not found,不是命令失效,是 Packagist 上真没这个命名空间 - 私有包查不到?先确认
composer.json是否配了正确的repositories,token 是否有效;镜像源(如阿里云)可能延迟数小时,临时切回官方源:composer config -g repo.packagist composer https://packagist.org - 输出太长想只看版本号?加
--format=json配合jq最干净:composer show -a monolog/monolog --format=json | jq -r '.versions | join("\n")'
为什么 composer show 有时返回空或报错
最常被忽略的一点:composer show 完全依赖 vendor/composer/installed.json。没有 vendor 目录时,它不会回退到 composer.lock,也不会尝试重装,而是直接报错或静默退出。
- 刚克隆项目但还没
composer install?vendor不存在 → 所有show命令都失效 - CI 中清除了
vendor但没重新装,又跑show做校验?结果为空,不是命令坏了,是前提条件不满足 - 全局包不能用
composer show查,必须换composer global show;误用会导致“明明装了laravel/installer却查不到”
查 Composer 自身版本不是查包版本
composer --version 显示的是 Composer 可执行文件自身的版本(如 2.7.7),和项目里任何 PHP 包的版本无关。它不反映 php 版本、不读 composer.json、也不受项目目录影响。
- 输出里括号中的时间(如
(2024-06-12 13:45:00))是官方 PHAR 构建的 UTC 时间,不是你本地安装时间 - 看到
dev-main?说明是源码构建版,功能一致,但自动更新、签名验证等行为可能受限 - 终端里
composer --version显示旧版本?大概率是PATH里多个composer并存,老版本路径排在前面;用which composer(macOS/Linux)或where composer(Windows)确认真实路径
真正容易被绕晕的点在于:同一个命令,加不加参数、有没有 vendor、是不是全局环境,结果天差地别。别假设它会“智能 fallback”,它只做明确指定的事。











