abandoned 字段用于声明包已被官方废弃并提示迁移,值为 true 或替代包名,触发终端黄色警告;错误格式被忽略,且仅对 Packagist 公开包或正确配置的私有仓库生效。

composer.json 中 abandoned 字段的作用
它不是用来“弃用当前项目”,而是告诉 Composer:这个包已被官方废弃,使用者应迁移到另一个替代包(或彻底停用)。一旦设置,composer install 或 composer update 时会向终端输出黄色警告,提醒依赖该包的用户注意。
如何正确填写 abandoned 字段
该字段必须是字符串,且只能是以下两种格式之一:
-
true:表示项目已彻底废弃,无替代方案(例如原作者停止维护且不推荐任何迁移路径) - 一个合法的 Composer 包名(如
"monolog/monolog"):表示推荐迁移到该包
错误写法包括:null、false、数组、URL、中文描述——这些都不会被识别,Composer 会静默忽略。
{
"name": "acme/legacy-lib",
"abandoned": "acme/new-lib"
}
配置后为什么没看到警告?
常见原因有三个:
- 你正在运行
composer install,但该包是通过require-dev引入的,而默认不检查开发依赖的弃用状态(需加--with-all-dependencies) - 你本地已缓存旧版本的
composer.lock,且未执行composer update acme/legacy-lib触发元数据刷新 - 目标包未发布新版本(
abandoned是 package metadata 的一部分,只在 packagist.org 索引新版本时生效)
验证是否生效:访问 https://packagist.org/packages/acme/legacy-lib,页面右上角会显示「Abandoned」徽章和跳转链接。
与 replace 和 provide 的关键区别
abandoned 是纯提示性字段,不影响安装逻辑;而:
-
replace会让 Composer 认为本包“代替”了另一个包,可阻止后者被安装 -
provide声明本包实现了某个虚拟包(如"psr/log-implementation"),供其他包按能力依赖
三者常共存,但目的不同。比如一个废弃的 PSR-3 实现可能同时设:"abandoned": "monolog/monolog"、"replace": {"psr/log-implementation": "*"}、"provide": {"psr/log-implementation": "1.0"} —— 但要注意:replace 不会自动触发迁移提示,只有 abandoned 会。
最容易被忽略的是:弃用声明只对 packagist.org 上的公开包有效;私有仓库(如 Satis、Private Packagist)需要确保其 metadata 接口也返回 abandoned 字段,否则终端不会显示警告。










