“ext-xxx is abandoned”提示实为php弃用警告,并非composer错误;它源于php解析composer.json时遇到dev-master等已弃用字段触发e_deprecated,composer仅原样输出。

composer install 报“ext-xxx is abandoned”不是 Composer 错误
这行提示根本不是 Composer 自己抛的,而是 PHP 解析器在加载 composer.json 或某个依赖的 composer.json 时,遇到已弃用的字段(比如 require-dev 里写了 "phpunit/phpunit": "dev-main")触发了 E_DEPRECATED。Composer 只是把 PHP 的警告原样打出来,它本身不校验这些字段是否过时。
常见被弃用的配置项包括:require-dev 中使用 dev- 分支别名(如 "dev-master")、repositories 里用 packagist 类型("type": "packagist")、或 config 下写 "use-include-path": true(PHP 8.0+ 已废弃)。
- 直接搜
dev-master、dev-main、packagist、use-include-path这些关键词,替换为稳定版本约束(如"^10.0")或删掉冗余配置 - 运行
php -d error_reporting=22527 -r "json_decode(file_get_contents('composer.json'));"(PHP 8.0+)可强制暴露所有弃用警告,比等composer install时看到更早 - 别信
composer validate—— 它默认不开启弃用检查,就算通过也不代表没弃用字段
为什么加 --ignore-platform-reqs 后还是报弃用警告
--ignore-platform-reqs 只跳过 PHP 版本、扩展是否存在等平台检查,它完全不影响 PHP 解析 JSON 配置时触发的弃用警告。只要 composer.json 里有被弃用的字段,哪怕你用 PHP 7.4 跑,只要 PHP 版本 >= 8.0,就会报。
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
- 确认 PHP 版本:运行
php -v,如果 ≥ 8.0,就说明是语言层弃用,不是 Composer 行为 - 检查是否启用了全局弃用报告:
php -i | grep error_reporting,若输出含E_DEPRECATED,那就是 PHP 主动开了 - 临时屏蔽(仅调试):在
composer.json同级建一个test.php,内容为<?php error_reporting(E_ALL ^ E_DEPRECATED); require 'vendor/autoload.php';,验证是否真由配置引起
composer.lock 里残留弃用字段导致 install 崩溃
Composer 2.2+ 对锁文件格式更严格,如果 composer.lock 是旧版生成的,里面可能含 "content-hash" 结构差异、插件元数据字段(如 "plugin-api-version")或废弃的 "dist" 字段(如 "type": "package"),2.x 解析时会直接 fatal error。
- 先清缓存:
composer clear-cache - 删掉
composer.lock和vendor/,再跑composer install --no-dev --optimize-autoloader重生成 - 若仍失败,用
jq '.' composer.lock > /dev/null快速验证 JSON 合法性;失败则说明锁文件损坏,必须重建 - CI 脚本里禁止复用旧
composer.lock—— 它不是只读文件,是环境快照,版本升级后必须重新生成
autoload-dev 残留引发 Class not found 的假弃用提示
有时你看到 Class 'PHPUnit\Framework\TestCase' not found,但 composer install --no-dev 明明执行成功了。这不是弃用问题,而是 autoload-dev 路径仍注册在 vendor/autoload.php 里,而 vendor/phpunit/phpunit 根本没装——类映射存在,但文件不存在,PHP 报错时顺带把 __autoload 相关弃用也刷出来,干扰判断。
- 检查
composer.json是否还保留"autoload-dev"块;有就删掉,再跑composer dump-autoload - 或者保留
autoload-dev,但部署时加参数:composer dump-autoload --no-dev,确保不生成测试路径映射 - 验证方式:打开
vendor/autoload.php,搜索Tests或tests/,如果存在且对应目录没装包,就是这个原因
composer.json 里,你改不了。这时候得靠 composer show vendor/package 查它是否声明了 "replaces" 或是否已标记 abandoned,再决定是升版本、换包,还是 fork 修复。










