Rector不能安全重构vendor/目录代码,因其设计仅支持项目自有源码(如src/),第三方库应通过升级版本而非修改代码来适配新PHP语法。

直接说结论:Rector 不能安全、可靠地重构你 vendor/ 目录下的依赖库代码——这不是配置问题,而是设计限制。它只应处理你项目自己的源码(src/、lib/ 等),对第三方库做自动修改会破坏依赖完整性、引发版本冲突,且 Rector 本身也明确不支持此场景。
为什么 vendor/ 下的代码不能用 Rector 自动重构
Rector 的核心机制是加载类、解析 AST、应用规则、重写文件。而 vendor/ 中的代码:
- 通常未被项目
composer.json的autoload或autoload-dev覆盖,Rector 扫描时直接跳过或报Class not found - 即使强行加
$parameters->set(Option::AUTOLOAD_PATHS, ['vendor/']),也会触发大量命名空间冲突、类型解析失败(如FQCN解析错乱) - Rector 修改后的文件会被 Composer 下次
install或update覆盖,所有改动白费 - 依赖库作者已通过版本号控制兼容性,擅自改其内部实现等于绕过语义化版本契约
想升级依赖库里的旧语法?正确路径是换版本,不是改代码
如果你发现某个依赖库用了 PHP 5.6 风格语法(比如 array()、create_function()),说明它本身已陈旧。该做的不是用 Rector 去“修”,而是:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 查它的 GitHub 仓库,看是否已有支持 PHP 8.x 的新版(比如从
v1.2升到v2.0) - 若无新版,考虑替换为功能相近但持续维护的替代库(例如用
symfony/console替代某个废弃 CLI 工具) - 实在无法替换,可 fork 后在自己分支里手动升级 + 提 PR,再通过
"repositories"指向私有源 - 极少数情况需临时 patch(如用
composer-patches),但这是运维层操作,和 Rector 无关
哪些场景下 Rector 可以“碰” vendor/ 里的东西
仅限以下两类边缘但合法的用途,且必须手动控制、不可批量扫:
-
分析依赖入口文件:比如你项目用了
bin/my-tool,它 require 了vendor/autoload.php并调用某第三方类,此时可在rector.php中显式加$rectorConfig->autoloadPaths(['bin/my-tool']),让 Rector 正确解析该脚本——但它只改bin/my-tool,不碰vendor/里的任何文件 -
验证自定义规则对第三方 API 的适配性:写一个
MyFrameworkUpgradeRector规则后,用--config指向测试用例(含 mock 的 vendor 类引用),仅用于单元测试,不参与实际process
真正容易被忽略的点是:Rector 的 --paths 默认值(['src', 'tests'])根本不会包含 vendor/,哪怕你误写了 ['src', 'vendor'],它也会因自动加载缺失而静默跳过——不会报错,也不会改任何文件,你以为它“没干活”,其实是它压根没资格干这事。

















