插件降级必须用composer require,不能靠composer update;需先remove再require具体版本,冲突时加--with-all-dependencies,若插件依赖旧版Composer则须手动降级其PHAR并重装。

插件降级必须用 composer require,不能靠 composer update
Composer 插件(如 phpstan/extension-installer、dealerdirect/phpcodesniffer-composer-installer)本质是普通包,但它的加载时机早于常规依赖,且受 Composer 自身版本严格约束。直接运行 composer update vendor/plugin-name 会失败或静默忽略——因为 update 默认只升不降,且插件的 require 约束可能被锁死在高版本。
正确做法是显式声明目标版本并触发重协商:
-
composer remove vendor/plugin-name(可选,但能避免残留配置干扰) -
composer require vendor/plugin-name:1.2.3(写死具体版本,不带^或~) - 若报冲突,加
--with-all-dependencies:它会同步调整插件所依赖的其他包(比如phpstan/phpstan的主版本)
插件兼容性卡在 Composer 版本上?先确认自身版本能否支持
很多插件明确要求 Composer v2.x,而你却在用 v1.x;或反过来,某些老插件(如 hirak/prestissimo)已彻底不兼容 v2.5+。此时降级插件本身没用,得先看 composer --version 输出。
常见错误现象:
- 执行
composer require后提示Plugin installation failed,但没说原因 -
composer diagnose显示Plugin X requires composer-plugin-api ^2.0.0, found 1.2.3 - 插件安装后
composer install不生效,日志里完全不提它
解决路径分两层:
- 若插件文档标明支持
composer-plugin-api ^1.0,而你用的是 Composer v2.7+ → 必须降级 Composer 自身(见下一条) - 若插件只标
^2.0,但你当前是 v2.2.20 → 可尝试composer self-update 2.2.20,别跳到 v2.5+(v2.5 起移除了部分旧插件接口)
composer self-update 不能降级到 v1.x,插件要 v1 才能跑就得换二进制
想让 phpunit/phpunit 的旧版插件(如 v6.x 时代的 phpunit/phpunit-mock-objects)跑起来?别试 composer self-update 1.10.22 —— 它会报 Could not find version 1.10.22 或直接静默失败。v2.x 的 self-update 命令根本不查 v1 的发布列表。
唯一办法是手动替换 PHAR:
- 去 https://www.php.cn/link/d8b61c5dcee25a9a279f0c66a98a2467 下载官方 PHAR
- 校验 SHA384(官网页面有值,跳过=风险)
-
sudo mv composer.phar $(which composer)(Linux/macOS)或管理员权限覆盖 Windows 上的composer.bat和composer.phar - 删掉
composer.lock和vendor/,再composer install—— v1 不认 v2 生成的 lock 格式
插件降级后,composer.json 的 config.plugin.autoload 很可能失效
某些插件(尤其是自定义插件)依赖 config.plugin.autoload 字段动态加载类。v2.2+ 开始收紧 autoload 检查,而 v1.x 完全不校验。如果你从 v2.5 降到 v2.2.20 后插件不加载,先检查这个字段是否还存在、路径是否拼错。
更隐蔽的问题:
- v2.5+ 强制插件必须声明
extra.composer-plugin,旧插件若没这行,v2.5 就直接跳过;降级到 v2.2.20 后它又活了,但行为可能和 v1.x 不同 - 插件内部调用了
Composer\Script\Event的新方法(如getIO()),而你降级的只是插件包,不是 Composer 二进制 → 运行时 fatal error - 验证方式:执行
composer show vendor/plugin-name,看输出里有没有type: composer-plugin;再跑composer install -vvv,搜Loaded plugin日志行
插件兼容性问题最常卡在「你以为只动了插件,其实 Composer 版本、PHP 版本、lock 文件格式、autoload 规则全在联动」。动手前先 composer why-not vendor/plugin-name:1.2.3,比硬试快十倍。


















