运行 composer show vendor/package-name 可直接查看已安装包的当前版本,如 composer show monolog/monolog 输出中 versions 行所示,可能是 v3.5.0、dev-main 或带 commit hash 的开发版。

直接查已安装包的当前版本
运行 composer show vendor/package-name 就能立刻看到这个包在你项目里装的是哪个版本,比如 composer show monolog/monolog 输出里的 versions 行就是实际生效的版本(可能是 v3.5.0、dev-main 或带 commit hash 的开发版)。
常见错误现象:
- 写错大小写或漏掉
vendor/前缀,比如输成Monolog/Monolog或monolog→ 报错Package not found - 包只在
require-dev里,但你上次是用composer install --no-dev装的 →composer show查不到它 - 刚改了
composer.json但没composer install或update→ 显示的仍是旧版本
查远程所有可用版本(含最新 tag)
用 composer show --all vendor/package-name 才能拉取 Packagist 或你配置的私有源上的全部版本列表,包括 2.9.0、v3.0.0-rc1、dev-main 这类。
为什么有时查不到新版本?不是命令错了,而是:
- 本地缓存过期:执行
composer clear-cache再试,或加--no-cache强制直连(如composer show --all monolog/monolog --no-cache) - 包名不对或源没配:私有 Git 包必须在
composer.json的repositories里声明,并确保composer update --no-scripts刷新过元数据 - 没打正式 tag:只有
dev-main不代表“没版本”,只是作者还没发v3.x这样的 release
只看稳定版(过滤掉 dev / alpha / beta)
如果你只想升到靠谱的正式版,--all 默认会把所有分支和预发布版都列出来,得自己筛。最稳的方式是用 JSON + jq:
composer show --all monolog/monolog --format=json | jq -r '.versions | keys[] | select(test("^\d+\.\d+\.\d+$"))'
这行命令只输出形如 3.5.0、2.10.2 这种三位数字格式的版本号。没有 jq 的话,也可以用 grep 粗筛:
composer show --all monolog/monolog | grep -E '^[0-9]+\.[0-9]+\.[0-9]+' | tr -d ' '- 注意:有些包用
x.y两位格式(如laravel/framework的10.x),这种正则会漏,得手动确认
查特定版本的兼容性(PHP/扩展/依赖)
想确认某个版本能不能在你环境跑,别光看版本号,要查它的元数据:
-
composer show monolog/monolog 2.9.0→ 显示该版本要求的 PHP 版本、ext-json是否必需、依赖哪些其他包及其约束 - 如果
composer.json里写了"platform": {"php": "8.1"},而某版本 require"php": "^8.2",那它压根不会出现在--all结果里 —— Composer 会在本地做一次兼容性预筛 - 加
-s可看 autoload 映射:composer show -s monolog/monolog能快速验证类路径是否对得上,避免Class not found
真正容易被忽略的是缓存和平台约束:很多人反复试 --all 都看不到新版本,第一反应是命令失效,其实只是 ~/.composer/cache/repo/https---packagist.org/ 里那份索引文件太老了;还有人以为装上了就能用,结果 runtime 报 PHP 版本不满足——那是因为没用 composer show vendor/package version 看过具体 require 字段。










