Composer降级必须用composer require vendor/package:old-version --with-all-dependencies,否则子依赖冲突时会静默失败;不加该参数、仅update或手动改composer.json均不可靠,且需配合dump-autoload和清理vendor/确保生效。

composer require vendor/package:old-version 必须加 --with-all-dependencies
不加这个参数,Composer 在子依赖冲突时会静默跳过,命令看似执行成功,但 vendor/ 和 composer.lock 实际没变。这不是 bug,是默认行为:它只尝试满足你指定的包,不管其他依赖是否兼容。
- 正确写法:
composer require monolog/monolog:2.2.4 --with-all-dependencies - 错误写法:
composer require monolog/monolog:2.2.4(可能无提示、无变更) - 如果报
Your requirements could not be resolved,先运行composer why-not monolog/monolog:2.2.4查具体冲突来源 - 版本号必须写死,别用
^2.2或~2.2.0,否则仍可能装到 2.2.9
别信 composer update vendor/package 能降级
composer update 默认只升不降,且只响应 composer.json 中已声明的约束。它不会主动把已安装的 v3.1.0 拉回 v2.9.2,除非你先把约束改成 "monolog/monolog": "2.9.2" 并确保该版本在当前 PHP 环境下可用。
- 执行后
composer.lock哈希没变、vendor/文件没更新?加-v看日志,大概率见到Skipping monolog/monolog (already at 3.1.0) - 检查
config.platform.php:如果设为"8.2",而目标旧版只支持^7.4 || ^8.0,Composer 会静默过滤掉它 - 想精准控制单个包,优先用
require+--with-all-dependencies,而不是改composer.json后跑update
降级后 Class not found?不是没装对,是 autoload 没刷新
即使 composer show monolog/monolog 显示版本正确,vendor/ 里文件也替换了,运行时仍报 Class 'Monolog\Logger' not found,90% 是 autoload 缓存残留。
- 立刻执行:
composer dump-autoload - 如果是 PHP-FPM 环境,顺手重启服务:
sudo systemctl reload php-fpm - 别手改
composer.lock:把"version": "3.1.0"改成"2.2.4"并填旧哈希,几乎一定失败——autoloader 按 lock 生成 classmap,但 zip 包内容和哈希对不上 - 也别只
git checkout composer.lock就完事:必须rm -rf vendor后再composer install,否则vendor/里还残留新版本文件
真正安全的回退路径只有两条
Composer 没有操作历史,不记录“上一次是什么”,所谓回退,本质是回到某个已知、可复现的状态。所有花式操作(比如手动改 json、删 lock、模拟 rollback)都绕不开这两个前提:
- Git 还原
composer.lock+ 彻底清空vendor/+composer install - 或用
composer require vendor/package:old-version --with-all-dependencies显式重装,并接受它对整个依赖图的协调 - PHP 版本或扩展不一致:旧依赖可能要求 PHP 7.4,而当前环境是 8.2,
composer install不报错但运行时报Fatal error - 第三方配置或脚本没同步:比如旧版 post-install-cmd 生成的配置文件,在新 lock 下不会自动重建











