composer show -a 查不到所有版本是因为它只显示本地已声明或已安装包的信息,而非远程全部版本;真正能查全部版本的是 composer show -all(两个l),它通过 packagist api 获取所有已发布且未删除的标签和分支别名。

composer show -a 为什么查不到包的所有版本
因为 composer show -a 实际上只列出当前 composer.json 中已声明(或已安装)的包,加上它们的依赖树,并不拉取远程仓库的全部历史版本。它不是“版本浏览器”,而是“已知包信息查看器”。你执行后看到的版本,基本是本地锁文件或已安装版本,和 Packagist 上实际发布的所有 dev-、1.x-dev、v2.3.0、2.3.x@dev 等完全不一致。
真正能查到所有版本的命令是 composer show -all
注意:是 -all(两个 l),不是 -a。这个参数会让 Composer 连接 Packagist API,强制获取指定包在仓库中**所有已发布且未被删除的版本标签和分支别名**。前提是包名拼写准确、网络可访问 Packagist(国内可能需配置镜像)。
-
composer show -all monolog/monolog→ 列出 Monolog 所有稳定版、RC、beta、dev 分支别名 - 如果返回空或报错
Package not found,先确认包名是否大小写敏感(Packagist 区分大小写,但部分镜像不严格) - 输出里带
dev-前缀的是分支快照(如dev-main),带v或纯数字的是 tag(如v3.4.0) - 该命令不依赖本地
vendor/或composer.lock,干净环境也能用
查版本时容易忽略的兼容性陷阱
看到一堆版本不等于都能装。Composer 安装时还要过 PHP 版本、扩展、平台配置三关。比如一个包标了 "php": "^8.1",你在 PHP 7.4 下即使 show -all 看到了 v2.0.0,require 时也会被自动过滤掉。
- 运行
composer show -all vendor/package后,重点关注每行末尾括号里的约束提示,例如(requires php ^8.0) - 如果目标是降级适配老项目,优先筛掉带
dev-和-alpha的行——它们不稳定,且可能缺失composer.json中的conflict声明 - 某些私有包或 GitHub 直链包(
"type": "package")不会出现在show -all结果里,只能去源仓库手动看 Releases 或 Tags
替代方案:直接查 Packagist 页面或 API
当 composer show -all 因网络或镜像问题失败时,最稳的方式是打开浏览器访问 https://packagist.org/packages/vendor/package。页面右侧 “Versions” 栏就是完整列表,点击每个版本还能看到它要求的 PHP 版本、依赖项、发布时间。
- API 更直接:
curl https://packagist.org/packages/vendor/package.json | jq '.package.versions'(需安装jq) - 国内用户若用阿里云镜像,
show -all可能延迟几小时,网页版实时性更高 - 注意:有些包启用了 “abandoned” 标记(如
monolog/monolog曾标记过php-logging/logger),show -all不会提示废弃状态,但网页会显眼标出
composer.json 里 config.platform.php 设的值、PHP 实际版本、以及那个包自己 composer.json 里写的 require 和 conflict。










