验证一堆 PHP 文件的语法很慢
php -l file.php
作为持续集成设置的一部分,我们用于验证许多 php 文件的语法。我们实际上做了类似的事情:`find . -name "*.php" | xargs --max-args=1 php -l" 因为php 可执行文件只接受一个参数。
这非常慢,主要是因为它涉及为每个 PHP 文件启动一个全新的解析器/解释器(更不用说进程),以验证它的语法,我们有数千个。
有更快的方法吗?
验证一堆 PHP 文件的语法很慢
php -l file.php
作为持续集成设置的一部分,我们用于验证许多 php 文件的语法。我们实际上做了类似的事情:`find . -name "*.php" | xargs --max-args=1 php -l" 因为php 可执行文件只接受一个参数。
这非常慢,主要是因为它涉及为每个 PHP 文件启动一个全新的解析器/解释器(更不用说进程),以验证它的语法,我们有数千个。
有更快的方法吗?
在搜索中添加时间怎么样?
`find . -mtime -7 -name "*.php" | xargs --max-args=1 php -l
到 find 命令只验证上周修改过的文件?
我假设您的大部分代码库不会每隔几天更改一次?
更新
您可能还想尝试 -newer 标志
`find . -newer /path/to/file -name "*.php" | xargs --max-args=1 php -l
它会发现所有比给定文件更新的文件,非常方便,特别是如果您的版本控制每次结帐时都会更改某个系统文件,或者使用:
touch -t 201303121000 /path/to/file
创建一个与 -newer 一起使用的虚拟文件
出于同样的原因,我完全放弃了php -l
,尽管在我的情况下(也许在你的情况下)这并不重要。
由于我使用 PHPUnit 进行单元测试,因此不需要对正在测试的文件进行 lint。如果文件无法通过 linter,它也不会通过任何测试(即使是仅包含文件的测试)。
如果你没有用 PHPUnit 覆盖 100% 的文件,你可以用类似的东西来伪造 linter 的效果:
class FakeLinterTest extends PHPUnit_Framework_TestCase {
public function testLintAllTheFiles() {
foreach ($this->listAllPHPFiles() as $file) {
include_once($file);
}
}
private function listAllPHPFiles() {
// Traverse your entire source tree.
}
}
该代码完全未经测试。此外,如果您有一个大项目,您可能需要玩有内存限制的游戏和/或将“lint”分解成块以阻止它破坏您的 CI 系统。