默认不显示弃用警告,需加 -v 或 -vv 参数(如 composer update -v);php 运行时弃用须配合 php -d error_reporting=e_all;定位用 composer show、composer depends 和 grep -r 检查 autoload 映射。

弃用警告不是错误,但它是运行时崩坏的前哨——Composer 不会替你处理,但能帮你定位、拦截、验证迁移效果。
怎么让 Composer 显式输出弃用警告
默认情况下,composer install 和 composer update 完全不显示弃用提示,哪怕包已被标记 abandoned 或调用了 mcrypt_encrypt()。必须主动打开 verbose 模式:
- 加
-v或-vv:如composer update -v,才能看到Package foo/bar is abandoned类提示 - CI 流水线里务必加
--no-ansi -v,否则日志里根本看不到任何弃用信息 - PHP 运行时弃用(如
Deprecated: Function each() is deprecated)需额外开启:在命令前加php -d error_reporting=E_ALL,否则 Composer 无法捕获
如何快速定位触发警告的具体包
别靠扫屏找,用命令直击源头:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 如果警告含文件路径(如
in /vendor/old-lib/src/Helper.php on line 23),直接执行composer show old-lib查版本和abandoned状态 - 如果警告只说
Package::getNames() is deprecated,大概率是 Composer 插件或旧版插件 API 导致,先跑composer update --no-plugins验证 - 查谁在拖这个包进来:
composer depends old/lib;若第一行不是你的项目名,说明它是二级依赖,不能直接删 - 确认是否真被加载:
grep -r "class OldHelper" vendor/composer/autoload_classmap.php,避免残留 autoload 干扰判断
替换废弃包时最容易翻车的三处断裂点
光改 composer.json 和跑 composer remove 远不够,新旧包常在底层断开:
- 命名空间变更:比如从
use GuzzleHttpRingClient切到use GuzzleHttpClient,全局搜索use Ring|new Ring\才能扫干净 - 方法签名不兼容:新包可能把
send($request, $options)改成send($request, array $options = []),参数类型或默认值变了就得重写调用 - autoload 配置不同:旧包用
psr-0,新包只支持psr-4,且根命名空间变了,composer dump-autoload -o后必须跑测试,否则Class not found会在运行时才爆
临时压制警告的风险与边界
压制只是掩耳盗铃,但某些场景下不得不做——前提是清楚代价:
- 开发调试时可在入口加
error_reporting(E_ALL ^ E_DEPRECATED),但禁止提交到主干 - CI 中为避免日志刷屏,可设
<ini name="error_reporting" value="24575"></ini>(即E_ALL & ~E_DEPRECATED),但必须配套运行 PHPStan 或 Rector 扫描弃用调用 -
composer update --no-warnings或重定向2>/dev/null会同时吞掉真实错误,不可用于 CI 验证 - 最危险的是在
php.ini里全局关E_DEPRECATED:下次升 PHP 版本时,所有本该提前暴露的问题都会变成上线后崩溃
真正难的不是换掉一个包,而是确认它是否还在某个测试辅助类、某个 require-dev 工具链、甚至某个自定义 autoload-files 里悄悄活着——这些地方一旦漏掉,composer test 就会安静地失败。










