composer 2.5+ 的 deprecation notice 是 php 运行时触发的 e_deprecated 级别警告,源于依赖包调用已被弃用的函数(如 each()、mysql_connect)或旧版 api,并非 composer 自身错误;它默认开启、不阻断执行但污染输出,需通过 php -d error_reporting=e_all 定位具体包并升级修复,而非仅屏蔽。

Composer 2.5+ 的 Deprecation Notice 是什么,为什么突然冒出来?
这不是错误,而是 Composer 自 2.5 版本起默认开启的弃用警告(PHP 的 E_DEPRECATED 级别),主要来自你项目中依赖的包调用了已标记为废弃的 PHP 函数或方法(比如 mysql_connect()、each()、或某些旧版 Symfony/Doctrine 的 API)。它不阻断执行,但会污染终端输出,尤其在 CI/CD 或脚本自动化中容易被误判为失败。
根本原因不是 Composer 本身有问题,而是你依赖链里某个包还没适配新版 PHP(尤其是 PHP 8.1+),或者你本地 PHP 配置开启了 error_reporting 包含 E_DEPRECATED。
临时隐藏警告:只适用于调试或 CI 场景
如果你只是想先让日志干净(比如避免 Jenkins 构建因警告变黄),可用以下方式抑制——但注意这只是掩盖,不是修复:
- 运行时加 PHP 参数:
php -d error_reporting=0 composer install
- 临时关闭 Composer 自身的弃用提示:
COMPOSER_DISABLE_TTY=1 COMPOSER_NO_DEPRECATION=1 composer install(COMPOSER_NO_DEPRECATION=1 是 Composer 原生支持的开关)
- CI 中常用组合:
php -d error_reporting=E_ALL & composer install --no-ansi --no-interaction,再配合 COMPOSER_NO_DEPRECATION=1
php -d error_reporting=0 composer install
COMPOSER_DISABLE_TTY=1 COMPOSER_NO_DEPRECATION=1 composer install(COMPOSER_NO_DEPRECATION=1 是 Composer 原生支持的开关)php -d error_reporting=E_ALL & composer install --no-ansi --no-interaction,再配合 COMPOSER_NO_DEPRECATION=1
⚠️ 注意:COMPOSER_NO_DEPRECATION=1 只影响 Composer 自己打印的弃用提示(比如它内部调用的废弃函数),对依赖包触发的 PHP 级别 E_DEPRECATED 无效——后者必须靠 PHP 配置控制。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
定位具体哪个包在触发 Deprecation Notice
直接看警告文本没用,因为 Composer 默认折叠堆栈。启用详细模式才能抓到源头:
- 加
-v 或 --verbose 运行:composer update -v 2>&1 | grep -A5 -B5 "Deprecated"
- 更可靠的方式:用
php -d display_errors=1 -d error_reporting=E_ALL,E_DEPRECATED composer.phar install,强制 PHP 输出完整错误上下文
- 如果警告来自 autoload 阶段,尝试
composer dump-autoload -v,有时能暴露是哪个类的 __construct() 或静态初始化在调用废弃函数
-v 或 --verbose 运行:composer update -v 2>&1 | grep -A5 -B5 "Deprecated"
php -d display_errors=1 -d error_reporting=E_ALL,E_DEPRECATED composer.phar install,强制 PHP 输出完整错误上下文composer dump-autoload -v,有时能暴露是哪个类的 __construct() 或静态初始化在调用废弃函数常见“重灾区”包括:老版本 monolog/monolog(1.x)、symfony/console()、<code>doctrine/inflector(),以及大量未更新的 Laravel 5.x 插件。
真正修复:升级依赖或打补丁
隐藏只是权宜之计。要根治,得找到触发警告的具体包并处理:
- 运行
composer show --outdated,重点关注 symfony/*、doctrine/*、phpunit/phpunit、monolog/monolog 这几类高频废弃源
- 对单个包升级测试:
composer update symfony/console --with-dependencies,观察警告是否消失;若失败,说明下游有兼容性约束,需查 composer why-not symfony/console:^5.4
- 如果卡在某个老旧包(如私有组件或 abandonware),可在其
composer.json 中加 "minimum-stability": "dev" 和 "prefer-stable": true,再尝试升到带修复的 dev 分支
- 极端情况需 patch:用
composer config repositories.foo path ./patches/foo 引入本地修改后的版本,只改掉那行 each() 调用
composer show --outdated,重点关注 symfony/*、doctrine/*、phpunit/phpunit、monolog/monolog 这几类高频废弃源composer update symfony/console --with-dependencies,观察警告是否消失;若失败,说明下游有兼容性约束,需查 composer why-not symfony/console:^5.4
composer.json 中加 "minimum-stability": "dev" 和 "prefer-stable": true,再尝试升到带修复的 dev 分支composer config repositories.foo path ./patches/foo 引入本地修改后的版本,只改掉那行 each() 调用PHP 8.2 开始,each() 已被彻底移除,这类警告未来会变成致命错误。现在看到的 Deprecation Notice 就是最后的提醒窗口——拖得越久,后续迁移成本越高。










