要查看 composer 包所有历史版本,需直接调用 packagist api(如 https://packagist.org/packages/{vendor}/{package}/json),解析返回 json 中 .package.versions 字段,用 jq 提取版本号与发布时间,并按语义化规则筛选 stable 版本。

直接查 Packagist API 获取包的版本列表
Composer 本身不提供“查看历史版本变更”的命令,composer show 只显示当前已安装版本或最新稳定版,没法回溯。真要看到所有发布过的版本(含 alpha/beta/rc)、发布时间、对应 commit、是否弃用,得绕过 Composer CLI,直连 Packagist 的公开 API。
关键路径是:https://packagist.org/packages/{vendor}/{package}/json,比如查 monolog/monolog 就访问 https://packagist.org/packages/monolog/monolog/json。返回的是完整 JSON,versions 字段里按语义化版本倒序排列,每个条目含 time、dist、source 等信息。
- 别用
curl https://packagist.org/packages/xxx直接请求首页——那是 HTML,不是 API - 必须带
/json后缀,否则返回 404 或跳转到网页 - 响应头里有
X-RateLimit-Remaining,高频请求可能被限速(未登录时约 60 次/小时)
用 jq 快速提取版本和发布时间
拿到 JSON 后,人工翻太累。终端里用 jq 是最轻量的处理方式,不用写脚本也能筛出关键字段。
例如只看版本号和发布时间:
curl -s "https://packagist.org/packages/monolog/monolog/json" | jq -r '.package.versions | keys[] as $k | "\($k) \(.[$k].time)"' | sort -r
注意点:
-
jq -r输出原始字符串,避免引号干扰;不加-r会带双引号,复制粘贴易出错 -
.package.versions是实际结构,不是.versions——API 返回顶层是package对象 - 时间字段是 ISO8601 字符串(如
"2023-05-12T14:22:31+00:00"),sort -r能正确倒序
区分 stable / RC / dev 版本的筛选逻辑
Packagist API 不标记“是否 stable”,得靠版本号规则自己判断。Composer 的稳定性规则是硬编码在客户端的,Packagist 只管存数据。
常见情况:
- 纯数字版本(如
"2.10.0")→ 默认 stable - 含
-alpha、-beta、-RC、-dev的 → 非 stable(注意大小写,-rc和-RC都可能出现) - 以
dev-开头的(如"dev-main")→ 分支快照,无固定版本号 -
alias字段存在时(如"2.10.x-dev": {"alias": "2.10.0"}),说明该 dev 版本指向某个正式版
想只看 stable 版本?用 jq 过滤掉含短横线的:
curl -s "https://packagist.org/packages/monolog/monolog/json" | jq -r '.package.versions | keys[] as $k | select($k | contains("-") | not) | "\($k) \(.[$k].time)"'
为什么不能依赖 composer show --all
composer show --all 看起来像能列全版本,但它其实只查本地 composer.lock 或缓存里的元数据,而且默认走 Packagist 的“简略元数据接口”(/p/{vendor}/{package}.json),这个接口只返回最近几个版本,不是全量。
- 它不包含
time字段,无法判断发布时间 - 对废弃版本(
abandoned)无提示 - 遇到私有包或被 rate limit 的包,直接报
Could not load package错误,且不告诉你原因 - 如果你没运行过
composer update,缓存可能严重滞后
真正要审计版本演进、排查兼容性问题,必须跳过 Composer CLI,拿原始 JSON——这是唯一能拿到完整、时序准确、带源码引用信息的数据源。
API 返回的 source.reference 是 commit hash,和 GitHub/GitLab 上的提交一一对应,这才是版本变更的最终依据。其他所有封装层都会丢信息。










