composer show -a 不能查到所有历史版本,仅显示 Packagist 已索引的公开可安装版本,不包括被删除的 tag、私有仓库未同步 release 或未抓取的新发布版本。

composer show -a 能查到所有历史版本吗
不能完全查到“所有”——它查的是 Packagist 上已索引的、公开可安装的版本,不包括被删除的 tag、私有仓库未同步的 release、或尚未被 Packagist 抓取的刚发布版本。
实际效果取决于 Packagist 的缓存更新节奏(通常几分钟到几小时),以及包维护者是否规范打 tag(比如漏推 v 前缀、用错分支名)。
-
composer show -a vendor/package-name是当前最可靠的方式,它绕过本地缓存,直连 Packagist API - 若结果里缺了你确定存在的版本(比如 GitHub 上能看到
v3.1.0),先确认:composer config --global repos.packagist.org是否为默认源;再试试加--no-cache(部分 Composer 版本支持) - 遇到
Could not load package,不是命令错,而是包名拼写错误、大小写不符(如monolog/monolog≠Monolog/Monolog),或该包已被设为 private
只想要干净的版本号列表,怎么过滤
默认输出带描述、依赖、autoload 等字段,对批量筛选或 CI 场景太冗余。关键不是“怎么显示”,而是“怎么提取”。
- 推荐用
jq(如果环境允许):composer show -a --format=json monolog/monolog | jq -r '.versions | join("\n")' - 没
jq?用原生命令粗筛:composer show -a monolog/monolog | grep "versions" -A 1 | tail -n 1 | tr ',' '\n' | sed 's/^[[:space:]]*//; s/[[:space:]]*$//' - 注意:
versions字段里的顺序是 Packagist 返回的,不保证严格按语义化版本排序(比如dev-main可能夹在中间),真要排序得额外 pipesort -V
为什么加 -a 才能看到新版本,不加就只有旧的
因为不加 -a 时,Composer 默认优先读本地缓存(~/.composer/cache/repo/https---packagist.org/),而缓存不会自动刷新——尤其当你很久没运行 composer update 或 composer install 时,缓存可能停滞在几周前。
-
-a(即--all)强制跳过缓存,发起真实 HTTP 请求到 Packagist - 首次执行会稍慢(约 1–3 秒),后续请求受 Packagist CDN 影响,一般稳定在 500ms 内
- 如果你在国内且网络不稳定,偶尔会因超时导致“看似没新版本”,此时可重试,或临时换源:
composer config --global repos.packagist.org '{"type": "composer", "url": "https://packagist.phpcomposer.com"}'(注意该镜像已于 2025 年底停用,仅作示例)
查版本时顺带看兼容性,该关注哪些字段
光知道有 3.5.0 没用,得确认它能不能跑在你的 PHP 和扩展环境下。指定版本查详情比扫全量列表更高效。
- 执行
composer show monolog/monolog 3.5.0,重点看:require.php(如^8.1 || ^8.2)、require.ext-json(是否强制要求 JSON 扩展)、conflict(比如和symfony/console的某些版本互斥) - 若看到
"type": "metapackage"或"type": "project",说明这不是常规库,不能直接require,得看文档 - 开发分支(如
dev-main)的 autoload 信息可能和稳定版不同,调试 autoload 错误时务必查对应版本,而不是默认 latest










