直接用 composer audit --abandoned 是最准、最轻量的废弃包检测方式,它只读取 Packagist 元数据和 composer.json 中的 abandoned 字段,即时输出如“vendor/old-package is abandoned, use vendor/new-package instead”或“no replacement provided”,并受 config.ignore-abandoned 配置影响。

直接用 composer audit --abandoned,这是 Composer 内置、最准、也最轻量的方式。 它不依赖外部服务,不查漏洞库,只读 composer.json 里的 abandoned 字段和 Packagist 元数据,结果即时可靠。
为什么不用 composer outdated 查废弃包
composer outdated 只比对已安装版本和最新稳定版,完全不感知废弃状态。一个包可能早已被标记为 abandoned,但只要还有新 tag(比如有人 fork 后继续发版),它就显示“up to date”。你看到 vendor/old-package 1.2.0 → 1.2.1,却不知道 1.2.1 是社区硬撑的 fork,原作者早在 1.0.0 就停更了。
- 它不会提示
Package vendor/old-package is abandoned, you should avoid using it. - 它无法识别
"abandoned": "vendor/new-package"这类迁移指引 - 执行耗时长,尤其在依赖多的项目里,纯属白跑
composer audit --abandoned 的真实行为
这个命令不联网查 CVE,也不扫描代码,它只做三件事:检查 lock 文件中每个包是否在 Packagist 上被标记为废弃、是否配置了替代包、是否在本地 composer.json 的 config.ignore-abandoned 中被显式忽略。输出干净,每行一条明确结论:
vendor/old-package is abandoned, use vendor/new-package instead vendor/legacy-helper is abandoned, no replacement provided
- 有替代包时,会直接给出
use xxx instead,可立刻搜索替换 - 没替代包时,会标出
no replacement provided,提醒你得自己评估 fork 或重写 - 如果某包被
config.ignore-abandoned屏蔽,它压根不会出现在输出里——这点必须心里有数
容易被忽略的配置干扰点
很多人跑完 composer audit --abandoned 没输出,就以为没废弃包,其实可能是配置关掉了警告。Composer 2.9+ 默认开启废弃检查,但以下配置会静默压制:
-
"config": {"audit": {"block-abandoned": false}}—— 不阻断安装,但audit命令仍会报告 -
"config": {"audit": {"ignore-abandoned": ["vendor/old-package"]}}—— 这个包彻底从audit --abandoned输出中消失 -
"minimum-stability": "dev"且没设"prefer-stable": true—— 可能拉到 dev 分支的“假活跃”版本,掩盖真正废弃事实
检查当前生效配置,运行 composer config --list | grep -i abandoned,比盲猜靠谱得多。
废弃包确认后下一步不是立刻删,而是看 composer show
找到废弃包只是第一步。运行 composer show vendor/old-package,重点看三行:
-
versions : * 1.2.0—— 确认你实际装的是哪个版本,别被 lock 文件里一堆 ^1.x 搞晕 -
type : library—— 排除metapackage或project类型误判 -
source : https://github.com/vendor/old-package.git—— 点开看最后 commit 时间、issue 是否关闭、是否有 archived 标记
很多所谓“废弃包”,其实是源码仓库被作者设为 archived,但 Packagist 还没同步状态。这时 composer audit 不报,但 composer show 的 source 链接一眼见底。











