composer show --all vendor/package-name 是查 packagist 上某包所有已发布版本的唯一可靠命令,直连 api 获取完整元数据,无需预先安装,大小写敏感,--all 必须双横线,错误格式将导致本地缓存或报错。

composer show --all vendor/package-name 是查远程所有版本的唯一可靠命令
想看某个包在 Packagist 上到底发过哪些版本(包括 v3.5.0、2.9.x-dev、dev-main),必须用 composer show --all vendor/package-name。它会绕过本地缓存,直连 Packagist API 拉取完整元数据——不是“可能有”,是“实际发布过”的全部标签。
-
--all必须是双横线(--all),单横线-a在多数 Composer 版本中被忽略,结果和不加一样,只显示已安装版本 - 不需要提前
composer require或安装该包;即使项目里完全没用过monolog/monolog,也能查它的全部历史版本 - 如果输出里没看到刚发布的
v4.0.0-rc1,大概率是 Packagist 同步延迟(通常 ≤ 5 分钟),不是你命令写错了
别信 composer show -all(带空格)或 composer show --all 不带包名
composer show -all(中间有空格)是个常见误输,它等价于 composer show 加一个叫 -all 的包名,报错 Package not found: -all;而 composer show --all 不带包名,只会列出当前项目已安装包的本地缓存版本列表,根本不会请求远程——它压根不关心 Packagist。
- 错误示例:
composer show --all→ 只显示你vendor/里已有的那些版本,比如guzzlehttp/guzzle v7.8.1,但不会告诉你v7.9.0已发布 - 正确姿势:必须写全命名空间,
composer show --all guzzlehttp/guzzle,大小写敏感,GuzzleHttp/Guzzle会失败 - Windows 用户若用 Git Bash,注意路径分隔符不影响,但 cmd 中若遇中文乱码,加
chcp 65001再执行
只想要干净的版本号列表?用 grep + cut 或 jq 提取
默认输出包含描述、作者、依赖等字段,如果你只想快速扫一眼有哪些版本可选(比如挑一个兼容 PHP 8.1 的),直接过滤比肉眼找快得多。
- 提取所有版本号(去重+去空格):
composer show --all monolog/monolog | grep 'versions' | cut -d: -f2 | tr ',' '\n' | sed 's/^[[:space:]]*//; s/[[:space:]]*$//' - JSON 格式更稳定(需装
jq):composer show --all --format=json monolog/monolog | jq -r '.versions | join("\n")' - 注意:某些旧版 Composer(--format=json,会提示
unrecognized option,此时只能靠文本处理
为什么不用 packagist.org 网页代替命令行?
网页确实能看版本,但有两个硬伤:一是不能批量查(比如你想对比 symfony/console、symfony/event-dispatcher 的最新兼容版本),二是没有 CLI 那种“立刻可用”的上下文——你正改 composer.json,光标还在终端里,切窗口、输网址、点 Versions 标签,节奏就断了。
- 网页适合看发布时间、稳定性标记(stable / RC / dev)、下载统计;命令行适合做决策、写脚本、集成进 CI
- 网页上看到的
dev-main,命令行里可能显示为dev-main 3e8a2b1(含 commit hash),这对调试 autoload 映射或确认是否拉到最新开发态很有用 - 如果你的公司私有 Packagist(如 Satis 或 Private Packagist),
composer show --all仍有效,但前提是配置了对应 repository,网页则可能无法访问
--all 作用域的理解——它不是“显示全部包”,而是“对这个包,显示全部版本”。漏掉包名、写错横线数量、或误以为本地缓存=远程全量,这三处错得最多。










