老项目升级Laravel前须清旧立新:先删vendor和composer.lock,再用composer require精准安装目标版本核心依赖(如laravel/framework:^10.0等),最后执行composer dump-autoload -o刷新自动加载,确保环境纯净、兼容可控。

Laravel老项目升级版本前重新安装依赖,不是简单执行composer update,而是要主动重置依赖环境,避免旧锁文件和残留包引发兼容冲突。关键在于“清旧立新”,不是修补。
先删 vendor 和 composer.lock
这是最常被跳过的一步,但恰恰最重要。composer.lock记录的是上一次解析出的精确版本组合,Laravel大版本升级后,很多底层依赖(比如 Symfony、Doctrine、Illumination 组件)的约束已变,Composer 会优先沿用旧锁文件尝试复用,结果就是卡住、回溯失败或装错版本。
- 运行:
rm -rf vendor composer.lock
- 不要加
--ignore-platform-reqs或强行跳过校验,那只会掩盖问题。
再按目标版本精准安装核心依赖
别一上来就 composer update 全量更新。先让关键包落地一个可用基线:
- 明确指定 Laravel 主框架版本(如
^10.0),同时同步拉入官方要求的配套包:composer require laravel/framework:^10.0 \ spatie/laravel-ignition:^2.0 \ doctrine/dbal:^3.0 \ nunomaduro/collision:^7.0 \ phpunit/phpunit:^10.0 \ laravel/sanctum:^3.2
- 如果项目用到其他官方包(如 Sail、Tinker、Pennant),也建议一并明确加入
require命令中,避免后续自动推导出不兼容版本。
清理并验证 autoload
依赖装完后,立刻刷新自动加载映射:
composer dump-autoload -o
这能提前暴露类找不到、命名空间错位等问题(比如 Laravel 10 移除了 App\Providers\AppServiceProvider 的默认注册逻辑,若还手动引用它就会报错)。
检查并清理干扰项
- 删除
composer.json中的"minimum-stability": "dev"—— 它可能诱使 Composer 拉取 alpha/beta 分支,与稳定版 Laravel 冲突; - 移除 PHPUnit 9 相关扩展(如
phpunit-speedtrap),它们与 PHPUnit 10 的事件系统不兼容,会导致composer update中断; - 确认 PHP 版本满足新 Laravel 要求(Laravel 10 需 PHP 8.1+,Laravel 11 需 PHP 8.2+),不达标时
composer install会直接拒绝执行。
做完这些,依赖才算真正“重新安装”完成,后续才能安全跑迁移、测试和配置调整。


















