不能在项目 composer.json 中配置 "abandoned" 提醒他人,因该字段仅为 Packagist 平台元数据,仅对已发布包生效;本地设置被 Composer 完全忽略。

不能在你自己的项目 composer.json 里配 “abandoned” 提醒别人——这个字段只对被发布的包有效,且必须由 Packagist 平台生效。
为什么你在项目里写 "abandoned": true 没反应?
因为 abandoned 是 Packagist 的元数据标记,不是 Composer 运行时的本地配置项。它只在以下场景起作用:
- 你是一个包作者,已将
vendor/package-name发布到 Packagist,并登录后台点击了 DEPRECATE 按钮 - 你在该包的
composer.json中声明了"abandoned": true或"abandoned": "vendor/new-package",然后推送新版本(如v1.5.0),Packagist 才会抓取并展示弃用状态 - 其他用户执行
composer install或composer update时,Composer 从 Packagist API 获取到该包已被标记为废弃,才输出警告
换句话说:你本地项目的 composer.json 写了 abandoned,Composer 完全无视——它只关心你 依赖的第三方包 在 Packagist 上的状态。
如何真正让使用者看到弃用警告?
分三步走,缺一不可:
-
发布最终版:在你准备停更的包中,更新
composer.json,加入:{ "name": "your-vendor/old-package", "abandoned": "your-vendor/new-package", "description": "Legacy utility, replaced by new-package" }然后打一个新 tag(如v2.3.0)并git push --tags -
去 Packagist 点 DEPRECATE:登录 https://www.php.cn/link/ec811d0d775adc62776ba80fadd4ed19/packages/your-vendor/old-package,点右上角
DEPRECATE,填写推荐替代包名(如your-vendor/new-package)和简短说明 -
同步文档:在 GitHub README.md 顶部加醒目 banner:
⚠️ This package is abandoned. Please use [your-vendor/new-package](https://www.php.cn/link/ec811d0d775adc62776ba80fadd4ed19/packages/your-vendor/new-package) instead.
做完这三步,下一次别人运行 composer require your-vendor/old-package 或 composer update,就会看到:Package your-vendor/old-package is abandoned, you should avoid using it. Use your-vendor/new-package instead.
想临时屏蔽警告?别费劲了
Composer 没有 --no-abandoned-warnings 这种开关,也不支持全局关闭。有人试过在 composer.json 里加 "config": { "audit": { "block-abandoned": false } },但这只影响 composer audit 命令,对 install/update 无效。
- CI/CD 中真要过滤,只能用 shell 处理输出:
composer update 2>&1 | grep -v "is abandoned" - 但这是掩耳盗铃:警告不显示 ≠ 风险消失。PHP 8.4 兼容性、未修复 CVE、autoload 冲突……这些不会因为你没看见就自动解决
替代方案比“怎么标废弃”更重要
很多团队卡在“旧包还在跑,新包不敢切”,其实关键不在怎么标废弃,而在怎么安全过渡:
- 用
composer depends your-vendor/old-package查清谁在调它;如果是monolog/monolog这类间接依赖,优先升级那个上游包(比如把some/framework升到 v4.2+,它内部已切换到新实现) - 新包若改了命名空间,别硬套旧代码。例如从
Old\Client换成New\HttpClient,就老老实实重构调用处,别搞 class_alias 临时糊弄 - 如果替代包要求 PHP 8.2+,而你线上还是 8.1,那就得先升级 PHP —— 弃用警告本质是技术债的计时器,不是开关
最常被忽略的一点:Packagist 上标记弃用后,该包名永久冻结,不能再发新版本。所以务必确认 abandoned 字段写对了,拼错一个字母,用户就收不到迁移提示。










