rector 升级 laravel 易失败,主因是 php 版本低于 8.1 或缺失 ext-json/ext-tokenizer/ext-xml;规则集必须严格匹配目标版本(如 laravel 8→9 用 laravel_90);路径需明确指定并排除 vendor/storage,且仅处理语法迁移,目录结构等须手动补全。

直接用 rector process 升级 Laravel,大概率改出错、跳过文件、或报 Class not found ——不是 Rector 不行,是它对环境、配置、路径太敏感,稍有偏差就失效。
Rector 安装失败:PHP 版本和扩展缺一不可
Rector 6+(当前主流)强制要求 PHP ≥ 8.1,且必须启用 ext-json、ext-tokenizer、ext-xml。Laravel 9/10 项目常只开 json,漏掉后两者就会在运行时报 Class 'Rector\Core\Application\RectorApplication' not found,哪怕 composer require rector/rector --dev 看似成功。
- 先确认 PHP 版本:
php -v,低于 8.1 就别装 Rector 6,改用composer require rector/rector:^5.0 --dev - 检查扩展是否齐全:
php -m | grep -E "json|tokenizer|xml",缺哪个补哪个(Ubuntu 下常用sudo apt install php-xml php-tokenizer) - 装完务必清缓存:
composer clear-cache,再重装,否则旧composer.lock可能卡住 autoloader
LaravelSetList::LARAVEL_X0 必须严格匹配目标版本
Rector 升级靠规则集驱动,而 LaravelSetList::LARAVEL_90 和 LaravelSetList::LARAVEL_100 完全不兼容。用错 set,轻则零修改,重则把 use Illuminate\Support\Facades\Hash 改成不存在的类名。
- 从 Laravel 8 升到 9?只用
LaravelSetList::LARAVEL_90 - 从 9 升到 10?只用
LaravelSetList::LARAVEL_100 -
config/rector.php里只能留一个 set,多个同时启用会互相覆盖 - 别抄“通用配置”——Rector 的 Laravel 规则集不向下兼容,
LARAVEL_100对 Laravel 9 项目无效
rector process 报错或跳过所有文件:路径和排除项写错了
常见报错如 Cannot declare class because the name is already in use,根本原因是没排除 vendor/ 和 storage/,Rector 错误地去重写已编译的 facade 类或日志文件。
- 扫描路径必须具体,别用
.或./;优先写app/ config/ database/ routes/ resources/ - 必须显式排除:
--exclude vendor --exclude storage --exclude bootstrap/cache - 加
--dry-run先预览:vendor/bin/rector process app/ config/ --dry-run,确认改了哪些再正式跑 - 第一次执行建议加
-n(no interaction),避免交互中断流程
最易被忽略的是:Rector 只处理代码语法迁移,不碰配置结构、目录骨架、中间件注册方式或模型工厂写法。比如 Laravel 11 删除了 app/Http/Controllers 目录,Rector 不会帮你创建,得靠 php artisan upgrade 补全——自动工具只负责“能机械替换”的部分,剩下的全是手动活。











