必须手动在包的composer.json中设置abandoned字段才有效,值可为true、字符串(如"monolog/monolog")或null;需提交代码、打新tag、Packagist同步,且用户Composer版本≥2.2.0才会显示警告。

必须手动编辑包的 composer.json,填入 abandoned 字段,否则 Composer 完全不会识别废弃状态。
abandoned 字段怎么写才有效
这个字段只在包维护者的根目录 composer.json 中起作用,不是下游项目能配置的。值有三种合法形式:
-
"abandoned": true—— 仅声明废弃,不推荐替代 -
"abandoned": "monolog/monolog"—— 推荐具体替代包(注意大小写、vendor 名必须与 Packagist 注册名完全一致) -
"abandoned": null—— 明确废弃且无替代,Packagist v2 协议下等价于true
常见错误:写成 "abandoned": "php-logging/logger" 但该包实际不存在或未发布到 Packagist;Composer 不校验,只原样展示,结果就是误导用户。
为什么改了 composer.json 还不生效
改完文件只是第一步,后续步骤缺一不可:
- 必须提交到版本库主分支(如
main或master) - 必须打新 tag(例如
v2.1.0),旧版本安装时读的是旧composer.json,不会触发警告 - Packagist 需要同步——若用 GitHub 自动 hook,通常几秒内完成;若手动 submit,可能延迟几分钟
- 用户端需 Composer ≥2.2.0,旧版本(如 2.1.x)直接忽略该字段
验证是否生效:在干净环境执行 composer clear-cache && composer show -a vendor/package,看输出中是否有 abandoned 行。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
abandoned 和 replaces 的关系
这两个字段语义完全不同,不能混用:
-
abandoned是“我停更了,请换别的”,纯提示,不影响依赖解析 -
replaces是“我兼容它”,用于替代包声明自己可覆盖旧包(如"replaces": {"old/package": "^1.0"}),会影响 autoloading 和冲突检测
如果替代包没声明 replaces,哪怕 abandoned 指向它,Composer 也不会自动替换 require 或解决命名空间冲突——这点最容易被误判。
CI 或自动化流程里怎么防漏
靠人工检查容易遗漏,建议加一道脚本校验:
- 用
composer show -a vendor/package | grep abandoned判断字段是否存在 - 若值为字符串,用
composer show -s $REPLACEMENT确认替代包能否正常解析(避免拼错包名) - 发版前跑
composer validate,虽然不报abandoned错误,但能捕获 JSON 格式问题
最常被跳过的环节是:忘了打新 tag。改完 composer.json 直接 push,却不打 tag,结果所有已安装的旧版本用户永远收不到警告。

















