Composer 没有 composer show -a 命令,该写法会报错;查包所有历史版本应调用 Packagist API:curl -s "https://packagist.org/packages/vendor/package.json" | jq '.package.versions | keys[]'。

Composer 没有内置的 composer show -a 命令,该写法会直接报错:Command "show -a" is not defined。想查某个包的所有历史版本,得用其他组合方式。
用 composer show 查包基本信息和最新稳定版
这是最常用入口,但默认只显示当前锁定义或最新可安装版本,不列全部历史:
-
composer show vendor/package:显示包描述、最新稳定版(如v3.2.1)、依赖关系 -
composer show -p:列出所有已知包名(不含版本) - 它不展示历史 tag 或旧版本列表,
-a参数根本不存在,别被过时文档误导
真正能查全量历史版本的方法:调用 Packagist API
Packagist 是 Composer 默认仓库,所有公开包的版本数据都从这里来。直接请求其 JSON 接口最可靠:
curl -s "https://packagist.org/packages/vendor/package.json" | jq '.package.versions | keys[]'
- 把
vendor/package替成真实包名,比如monolog/monolog - 需要
jq解析 JSON;若没装,可用 Python 快速提取:python3 -c "import json,sys;print('\n'.join(json.load(sys.stdin)['package']['versions'].keys()))" - 返回的是所有带版本号的键(如
"dev-main"、"v2.10.0"、"1.25.0"),含不稳定分支和旧版
用 composer search 和 composer require 辅助验证版本是否存在
某些旧版可能因约束被过滤,需手动试探:
-
composer search vendor/package:确认包存在且名字拼写正确 -
composer require vendor/package:v1.2.3 --dry-run:加--dry-run不实际安装,只检查该版本能否解析(返回成功说明可用) - 注意语义化版本写法差异:
v2.0.0、2.0.0、^2.0在不同上下文行为不同;Packagist API 返回的 key 是原始 tag 名,未必都能直接require
为什么不能依赖本地 composer.lock 查历史版本
composer.lock 只记录当前项目已安装的精确版本(content-hash 锁死),不是版本数据库:
- 删掉 lock 文件后重 install,只会按
composer.json的约束拉取满足条件的最新版 - 历史版本信息不在本地缓存里;Composer 本身不维护“本地版本索引”
- 想追溯某次提交用过的版本?只能翻 Git 历史里的
composer.lock
Packagist API 是唯一权威来源,其他方式都是间接试探。别试 show -a,它不存在;也别指望 composer outdated 列出所有旧版——它只对比当前 require 约束下的可升级项。










