Composer Deprecation Notice 警告:为什么会出现?如何解决?
在使用 Composer 进行 PHP 项目管理时,你可能遇到过类似这样的 Deprecation Notice
警告信息。这些警告通常看起来令人困惑,但它们背后有着清晰的原因。
Deprecation Notice: Composer\Autoload\ClassMapGenerator::createMap(): Implicitly marking parameter $io as nullable is deprecated, the explicit nullable type must be used instead in phar://C:/composer/composer.phar/src/Composer/Autoload/ClassMapGenerator.php:64
Deprecation Notice: Composer\Autoload\PhpFileCleaner::match(): Implicitly marking parameter $match as nullable is deprecated, the explicit nullable type must be used instead in phar://C:/composer/composer.phar/src/Composer/Autoload/PhpFileCleaner.php:273
1. 为什么会出现这些警告?
这些警告信息并非错误,而是 PHP 8.0+ 在类型检查方面变得更加严格所导致的。主要原因有两个:
-
PHP 8.0+ 的严格类型检查:Composer 2.x 的部分旧代码最初是为 PHP 7.x 编写的。在 PHP 7 中,如果一个函数的参数没有显式声明为可空类型(
?Type
),但又在某些情况下被赋予了null
值,PHP 仍能正常运行。然而,在 PHP 8.0+ 中,这种隐式可空参数会触发Deprecation Notice
警告,要求开发者明确地使用?
符号来标注参数可能为null
的可能性。 -
你使用了旧版本或强制降级:如果你通过
composer self-update --2.2
等命令强制降级到 Composer 2.2.x 版本,你就会遇到这个问题。这个版本的代码没有完全适配 PHP 8.0+ 的严格规则,因此警告会大量出现。而 Composer 的最新稳定版(如 2.8.12)已经修复了这些问题。
此外,Composer 内部依赖的一些库,比如 justinrainbow/json-schema
,也存在类似的问题。这些库的弃用警告也会被 Composer 透传出来,让你以为是 Composer 本身的问题。
2. 如何解决这些警告?
解决这个问题的方法主要分为两种:治本和治标。
方法一:升级到最新稳定版(强烈推荐)
这是解决问题的最根本、最长久的方法。
composer self-update --stable
这条命令会安装 Composer 的最新稳定版本( 2.8.12),这个版本的所有弃用警告都已经得到了修复。这样做可以一劳永逸地解决兼容性问题,并获得新版本带来的性能提升和功能优化。
注意: 2.8.12 Changelog
修复了与版本验证相关的 JSON Schema 问题(#12512)
修复了 PHP 8.5 的弃用警告问题(#12513)
修复了对 Bitbucket API 令牌的支持问题(#12515)
修复了使用二进制文件时路径中包含空格的处理问题(#12524)
修复了 config --global 路径解析问题(#12537)
降低了加载包时的峰值内存使用量(#12516)
不再支持 react/promise 2.x 版本
方法二:临时忽略弃用警告
如果你的项目出于某种原因(例如遗留系统兼容性),无法升级 Composer,你可以临时抑制这些警告。
COMPOSER_NO_DEPRECATION_WARNINGS=1 composer update
通过设置 COMPOSER_NO_DEPRECATION_WARNINGS
环境变量为 1
,你可以只对当前命令生效,让 Composer 忽略所有弃用警告。但要注意,这只是一个临时方案,不建议长期使用。
3. 为什么升级时提示 2.2.25 而非最新版?
你可能会遇到这样的提示,没有遇到请忽略
Warning: You forced the install of 2.2.25 via --2.2, but 2.8.12 is the latest stable version.
这说明你使用了 --2.2
参数强制 Composer 仅在 2.2.x 分支内进行更新,因此它找到了该分支的最新版本 2.2.25。然而,系统检测到最新的稳定版是 2.8.12,因此给出了升级建议。除非你有非常特殊的需求,否则直接使用方法一才是最正确的做法。