
Rector 的 skip 规则不支持直接跳过目录,必须使用通配符(如 **/*)明确匹配目录下的所有文件,否则跳过规则将被忽略。本文详解如何精准限定扫描路径并排除子目录(如 tests/、vendor/),避免误处理。
rector 的 `skip` 规则不支持直接跳过目录,必须使用通配符(如 `**/*`)明确匹配目录下的所有文件,否则跳过规则将被忽略。本文详解如何精准限定扫描路径并排除子目录(如 `tests/`、`vendor/`),避免误处理。
在使用 PHP Rector 对 Symfony 项目进行自动化重构时,为保障安全与性能,通常需严格限定作用范围——仅扫描业务代码目录(如插件目录),同时排除其内部的 tests/、vendor/ 等非源码子目录。但初学者常误以为 skip() 支持目录级跳过,导致配置失效:
// ❌ 错误:以下 skip 规则不会生效
$rectorConfig->skip([
__DIR__ . '/plugins/*/tests', // 仅写目录路径 → 被忽略
__DIR__ . '/plugins/*/vendor', // 同上
]);
这是因为 Rector 的 skip 机制本质上是基于文件路径的过滤器,而非目录层级管理器。它只对实际匹配到的 文件 生效,而 '/plugins/*/tests' 这类路径不指向任何具体文件,因此被静默忽略。
✅ 正确做法是使用 **/* 通配符递归匹配目标目录下所有文件:
return static function (RectorConfig $rectorConfig): void {
// ✅ 仅扫描 plugins 下各插件的根目录(不含子目录)
$rectorConfig->paths([
__DIR__ . '/plugins/*',
]);
// ✅ 显式跳过 tests/ 和 vendor/ 下的所有文件(含嵌套)
$rectorConfig->skip([
__DIR__ . '/plugins/*/tests/**/*',
__DIR__ . '/plugins/*/vendor/**/*',
// 可选:也跳过 .git、.idea 等非代码目录
__DIR__ . '/plugins/*/.git/**/*',
__DIR__ . '/plugins/*/node_modules/**/*',
]);
};
⚠️ 注意事项:
-
**/*是 Rector 内置支持的 glob 模式,等价于“任意深度的任意文件”,不可省略末尾的/*; - 路径需使用正斜杠
/(Windows 下 Rector 会自动兼容); -
skip规则优先级高于paths,即先按paths筛出候选文件,再从中剔除skip匹配项; - 若某插件无
tests/目录,该 skip 规则不会报错,安全无副作用。
? 提示:可通过 --debug 模式验证规则是否生效:
vendor/bin/rector process plugins/my-plugin --debug
输出日志中将显示被跳过的具体文件路径,便于调试配置准确性。
综上,Rector 完全支持“路径限定 + 子目录排除”的组合策略,关键在于理解其 skip 的文件语义,并正确使用 **/* 表达式。合理配置后,既能聚焦核心代码,又能规避第三方依赖与测试代码带来的干扰,大幅提升重构可靠性与执行效率。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











