
Rector 的 skip 规则不支持直接跳过目录,而需明确指定通配符匹配文件路径(如 **/*);本文详解如何精准限定扫描范围并排除 tests/、vendor/ 等子目录内容。
rector 的 `skip` 规则不支持直接跳过目录,而需明确指定通配符匹配文件路径(如 `**/*`);本文详解如何精准限定扫描范围并排除 `tests/`、`vendor/` 等子目录内容。
在使用 PHP Rector 对大型 Symfony 项目进行代码重构时,合理控制作用域至关重要。你可能希望仅对特定插件目录(如 plugins/*)执行规则,同时严格避免触碰其内部的 tests/、vendor/ 或其他衍生目录——这类需求非常典型,但配置不当易导致跳过失效。
关键在于理解 Rector 的路径匹配机制:
✅ paths() 定义扫描入口目录(支持目录级通配,如 /plugins/*);
❌ skip() 不接受纯目录路径(如 /plugins/*/tests),它实际匹配的是文件路径,若未显式包含通配符,将无法命中任何文件;
✅ 正确写法是使用 **/* 显式表达“该目录下所有文件及子文件”,例如 /plugins/*/tests/**/*。
以下是推荐的完整配置示例:
return static function (RectorConfig $rectorConfig): void {
// ✅ 仅扫描 plugins 下各插件的根目录(不含 tests/vendor 等)
$rectorConfig->paths([
__DIR__ . '/plugins/*',
]);
// ✅ 正确跳过:使用 **/* 明确匹配所有嵌套文件
$rectorConfig->skip([
__DIR__ . '/plugins/*/tests/**/*',
__DIR__ . '/plugins/*/vendor/**/*',
__DIR__ . '/plugins/*/node_modules/**/*',
__DIR__ . '/plugins/*/dist/**/*',
]);
};⚠️ 注意事项:
-
skip中的路径必须为绝对路径(推荐用__DIR__拼接),相对路径或未展开的 glob 可能被忽略; - 跳过规则优先级高于
paths,但仅当路径实际匹配到文件时才生效; - 若仍遇到跳过无效,请运行
vendor/bin/rector --debug查看实际被加载的文件列表,验证路径是否被正确解析; - 避免在
skip中使用过于宽泛的模式(如**/tests/**/*),以免误伤主项目测试目录。
通过这一配置,Rector 将严格在 plugins/* 下扫描 PHP 文件,同时自动过滤掉各插件内 tests/ 和 vendor/ 等非源码目录,兼顾精准性与安全性。
立即学习“PHP免费学习笔记(深入)”;



















