composer 通过解析 composer.json 中的 abandoned 字段在 install/update/require 时显示弃用警告;该字段须为布尔 true、有效包名或完整 url,且仅对实际安装的依赖生效。

如何让 Composer 显示包已弃用(abandoned)警告
Composer 会在安装或更新时主动提示用户某个包已被弃用,但前提是包的 composer.json 中正确声明了 abandoned 字段。这不是靠文档或 README 提醒,而是由 Composer 解析元数据后直接输出的终端警告。
关键点:该声明只对使用该包作为依赖的项目生效,且仅在运行 composer install、composer update 或 composer require 时触发。
-
abandoned必须是字符串,可填true(表示彻底废弃,无替代)、包名(如"myvendor/old-package")、或 GitHub/GitLab 仓库地址(如"https://github.com/myvendor/new-package") - 若填包名,Composer 会尝试验证该包是否在 Packagist 上存在;若不存在,仍会显示警告,但不会自动建议安装
- 声明后无需发新版本——只要 Packagist 重新抓取了该版本的
composer.json(通常推 tag 后几分钟内完成),警告就会生效
为什么 abandoned 设为 true 比填新包名更稳妥
填 "myvendor/new-package" 看似友好,但容易引发误判:如果新包尚未发布、命名未同步、或 require 约束不匹配,用户执行 composer require myvendor/new-package 仍可能失败。而设为 true 只传递明确信号:“别再用了”,把迁移决策和适配成本留给用户自己评估。
实际案例中,不少维护者填了新包名却忘了同步更新其 autoload 或 PHP 版本约束,结果用户按提示装上后直接报 Class not found 或 PHP version mismatch。
- 推荐做法:先设
"abandoned": true,等新包稳定、文档齐备、示例可跑通后再改为具体包名 - 若新包是私有仓库,必须填完整 URL(如
"https://gitlab.example.com/mygroup/new-package"),否则 Composer 无法识别 - Packagist 不支持解析私有 URL 的元数据,所以此时不会自动 link,但终端警告仍会显示该 URL,供用户手动处理
用户端看到的警告长什么样?怎么确认它生效了
警告格式固定,出现在 composer install 或 composer update 输出末尾附近,形如:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
Package myvendor/old-package is abandoned, you should avoid using it. Use myvendor/new-package instead.
注意:只有当该包被实际安装(即出现在 vendor/ 下)时才会触发。如果只是在 require-dev 里声明但未启用,或被其他依赖间接拉入但最终未解出,就不会显示。
- 测试是否生效:删掉
vendor/和composer.lock,运行composer install—— 警告应立刻出现 - 若没看到,检查 Packagist 页面对应版本的 JSON 数据(点击 “View Raw composer.json”),确认
abandoned字段存在且值合法 - 常见错误:字段写成
"abandonded"(拼错)、放在extra里、或值为null/0/"false"(只有字符串"true"不被识别,必须是布尔true)
弃用声明对 Packagist 页面和搜索的影响
Packagist 前端会在包主页顶部显眼位置展示黄色横幅,内容为 “This package is abandoned and no longer maintained.”,并附带你填的替代信息(如果填的是有效包名或 URL)。但这个横幅**不改变包的搜索权重**,也不会阻止用户 require 它。
真正起作用的是 Composer 客户端的行为:它读取 metadata API 返回的 abandoned 字段,并在安装链路中插入警告。所以即使 Packagist 页面没刷新,只要 API 已更新(通常比页面快),本地 Composer 就能感知。
- API 查看方式:
curl https://packagist.org/p/myvendor/old-package.json | jq '.packages."myvendor/old-package"[0].abandoned' - 页面缓存可能长达数小时,但不影响功能;不必等横幅出现才认为生效
- 如果包已从 Packagist 删除(比如因违反政策),
abandoned字段将不再传播,警告也会消失 —— 所以弃用优先于下架
最易忽略的一点:弃用声明只影响未来安装行为,对已存在的 vendor/ 目录毫无作用。没有自动替换、不修改 composer.lock、也不触发 post-install-cmd。迁移必须由使用者手动完成。










