Symfony Finder 使用 glob 排除
Symfony Finder exclude with glob
我正在尝试 运行 PHP CS Fixer,我认为它是基于 Symfony(我不熟悉),并且在排除某些路径时遇到问题。
我的设置如下:
$finder = PhpCsFixer\Finder::create()
->in(__DIR__)
->exclude('lib/adodb')
->exclude('lib/bbcode')
->exclude('lib/joomla')
->exclude('lib/JSON')
->exclude('lib/pear')
->exclude('lib/phpass')
->exclude('lib/smarty')
->exclude('lib/smtp')
->exclude('modules/*/lib')
->name('*.class')
->name('*.inc')
->name('*.php')
;
基本上,我想排除:
modules/ANYNAME/lib/ANYFILE
modules/ANYNAME/lib/ANYSUBDIR/ANYFILE
但我发现 ->exclude('modules/*/lib')
行没有捕捉到这些。例如,modules/somemodule/lib/somefile.inc
仍在处理中。
我原以为这是因为我有 ->name('*.inc')
但不管有没有那条线似乎都会发生。
除 ->exclude('modules/*/lib')
一个外,其他工作正常。
有什么指点吗?
** Correction/Update **
问题似乎出在名字 selector 上。似乎不允许 select *.inc
使用 name
例如,然后尝试排除在 modules/xyz/lib
.
中找到的那些
克服这个问题会解决我的问题
PHP CS Fixer 可以接受任何可迭代对象作为查找器。
实际上,默认值只是 symfony/finder (https://github.com/symfony/finder/blob/master/Finder.php).
如您所见,exclude
不接受 glob。
你可以使用,例如,notPath
:
$finder = PhpCsFixer\Finder::create()
->in(__DIR__)
->notPath('#modules/.*/lib#')
->name('*.inc');
假设您有以下结构:
$ ls -lR
.:
共 8 个
drwxr-xr-x 2 keradus keradus 4096 Mai 5 20:32 a
drwxr-xr-x 3 keradus keradus 4096 Mai 5 20:31 模块
./a:
total 4
-rw-r--r-- 1 keradus keradus 24 Mai 5 20:35 a.inc
./modules:
total 4
drwxr-xr-x 3 keradus keradus 4096 Mai 5 20:31 ANYNAME
./modules/ANYNAME:
total 4
drwxr-xr-x 3 keradus keradus 4096 Mai 5 20:31 lib
./modules/ANYNAME/lib:
total 8
-rw-r--r-- 1 keradus keradus 24 Mai 5 20:35 b.inc
drwxr-xr-x 2 keradus keradus 4096 Mai 5 20:32 sub
./modules/ANYNAME/lib/sub:
total 4
-rw-r--r-- 1 keradus keradus 24 Mai 5 20:35 c.inc
即使这 3 个文件都违反了编码标准,也只有一个(未被 finder 排除)会被修复:
$ php-cs-fixer fix --dry-run -vvv
Loaded config default from "/home/keradus/tmp/.php_cs.dist".
F
Legend: ?-unknown, I-invalid file syntax, file ignored, S-Skipped, .-no changes, F-fixed, E-error
1) a/a.inc (braces)
我正在尝试 运行 PHP CS Fixer,我认为它是基于 Symfony(我不熟悉),并且在排除某些路径时遇到问题。
我的设置如下:
$finder = PhpCsFixer\Finder::create()
->in(__DIR__)
->exclude('lib/adodb')
->exclude('lib/bbcode')
->exclude('lib/joomla')
->exclude('lib/JSON')
->exclude('lib/pear')
->exclude('lib/phpass')
->exclude('lib/smarty')
->exclude('lib/smtp')
->exclude('modules/*/lib')
->name('*.class')
->name('*.inc')
->name('*.php')
;
基本上,我想排除:
modules/ANYNAME/lib/ANYFILE
modules/ANYNAME/lib/ANYSUBDIR/ANYFILE
但我发现 ->exclude('modules/*/lib')
行没有捕捉到这些。例如,modules/somemodule/lib/somefile.inc
仍在处理中。
我原以为这是因为我有 ->name('*.inc')
但不管有没有那条线似乎都会发生。
除 ->exclude('modules/*/lib')
一个外,其他工作正常。
有什么指点吗?
** Correction/Update **
问题似乎出在名字 selector 上。似乎不允许 select *.inc
使用 name
例如,然后尝试排除在 modules/xyz/lib
.
克服这个问题会解决我的问题
PHP CS Fixer 可以接受任何可迭代对象作为查找器。 实际上,默认值只是 symfony/finder (https://github.com/symfony/finder/blob/master/Finder.php).
如您所见,exclude
不接受 glob。
你可以使用,例如,notPath
:
$finder = PhpCsFixer\Finder::create()
->in(__DIR__)
->notPath('#modules/.*/lib#')
->name('*.inc');
假设您有以下结构: $ ls -lR .: 共 8 个 drwxr-xr-x 2 keradus keradus 4096 Mai 5 20:32 a drwxr-xr-x 3 keradus keradus 4096 Mai 5 20:31 模块
./a:
total 4
-rw-r--r-- 1 keradus keradus 24 Mai 5 20:35 a.inc
./modules:
total 4
drwxr-xr-x 3 keradus keradus 4096 Mai 5 20:31 ANYNAME
./modules/ANYNAME:
total 4
drwxr-xr-x 3 keradus keradus 4096 Mai 5 20:31 lib
./modules/ANYNAME/lib:
total 8
-rw-r--r-- 1 keradus keradus 24 Mai 5 20:35 b.inc
drwxr-xr-x 2 keradus keradus 4096 Mai 5 20:32 sub
./modules/ANYNAME/lib/sub:
total 4
-rw-r--r-- 1 keradus keradus 24 Mai 5 20:35 c.inc
即使这 3 个文件都违反了编码标准,也只有一个(未被 finder 排除)会被修复:
$ php-cs-fixer fix --dry-run -vvv
Loaded config default from "/home/keradus/tmp/.php_cs.dist".
F
Legend: ?-unknown, I-invalid file syntax, file ignored, S-Skipped, .-no changes, F-fixed, E-error
1) a/a.inc (braces)