composer show --all 看不到已删除包是设计使然,它仅查询 Packagist 实时元数据中 stable/prerelease 版本,不包含被删 tag、下架或废弃的版本;废弃状态需用 composer show -a 查看 abandoned 字段。

composer show --all 看不到已删除的包,这是设计使然
Composer 本身不提供「查看已被删除/下架/废弃的包」的能力。composer show --all 只列出当前 Packagist 上标记为 stable 或 prerelease 的版本,那些被作者手动删掉 tag、撤回发布、或因违规被下架的版本,根本不会出现在这个列表里——它查的是 Packagist 的实时元数据 API,不是 Git 历史。
常见错误现象:composer show --all vendor/package 返回空或只有最新几个版本,但你记得它以前有 v1.2.0;或者 CI 构建突然失败,报错 Could not find package vendor/package in a version matching "1.2.0",而 show --all 却查不到该版本。
- 真正已删除的包,Packagist 不再返回其 dist/source 下载地址,Composer 就无法解析和安装
- 如果你本地缓存里还存着旧版 zip(
composer cache-dir下的files/子目录),composer install仍可能成功——但这只是缓存残留,换一台机器就失效 - 想确认某个老版本是否“还在”,最可靠方式是直接访问 Packagist 页面:
https://packagist.org/packages/vendor/package,看历史标签页(Tags tab)是否显示;若 404 或标签消失,基本可判定已不可用
怎么知道一个包是否被废弃(abandoned)?
composer show -a vendor/package 是唯一能读取 abandoned 字段的内置命令。默认的 composer show 完全不显示这个信息,容易误判。
使用场景:你在维护一个老项目,发现某个依赖长期不更新,但不确定是作者放养了还是主动弃坑了。
- 输出中出现
abandoned: true,说明该包已被官方标记废弃,通常还会附带替代包名,如abandoned: league/flysystem - 输出为
abandoned: null或干脆不显示该字段,不代表安全——只代表 Packagist 没收到废弃声明 - 注意:
abandoned是作者在composer.json里手动加的字段并推送至 Packagist,不是自动检测结果;有些包停更多年却没标 abandoned,得靠人工判断
恢复已删除包的唯一可行路径:找缓存或镜像
如果项目 composer.lock 里锁定了一个已从 Packagist 删除的版本,而你又没备份,现在想重装,常规 composer install 会失败。这时候没有“回滚到历史版本”的魔法命令,只能靠外部资源。
- 先查本地缓存:
composer cache-dir输出路径后,进files/目录搜索包名或版本哈希,若存在对应 zip,composer install --no-cache仍可能跳过网络校验直接解压(但 Composer 2.5+ 默认校验哈希,失败则拒绝使用) - 尝试国内镜像源是否同步更全:
composer config repo.packagist composer https://mirrors.aliyun.com/composer/,部分镜像会保留已下架包的 dist 缓存数周 - 终极办法:去 GitHub/GitLab 查原仓库,看对应 tag 是否还在。如果 Git tag 还在,可临时改
composer.json为"dev-master#v1.2.0"并加"repositories"指向源码地址——但这绕过了 Packagist 安全校验,仅限紧急修复
为什么不能靠 git log 或 Packagist API 查完整历史?
Packagist 不是 Git 托管平台,它只同步作者主动 push 的 release 和 tag,并且会清理无效或重复记录。它的 API(如 /packages/vendor/package.json)返回的数据是精简后的发布快照,不含删除痕迹。
性能与兼容性影响:强行爬取所有历史 tag 并比对,需要遍历 GitHub API(受 rate limit 限制)、解析大量 JSON、处理重定向和 404,对单次诊断毫无性价比;Composer 本身也从未设计成版本考古工具。
- 想长期规避这类问题?项目上线前,把
vendor/打包归档,或使用私有 Packagist 镜像(如 Satis 或 Private Packagist)做发布快照 - 最容易被忽略的一点:
composer.lock文件本身不记录包是否被废弃或删除——它只存版本号和 dist hash。一旦上游消失,lock 文件就成了“遗嘱”,但执行权在 Packagist 手里










