6

验证一堆 PHP 文件的语法很慢

php -l file.php作为持续集成设置的一部分,我们用于验证许多 php 文件的语法。我们实际上做了类似的事情:`find . -name "*.php" | xargs --max-args=1 php -l" 因为php 可执行文件只接受一个参数

这非常,主要是因为它涉及为每个 PHP 文件启动一个全新的解析器/解释器(更不用说进程),以验证它的语法,我们有数千个。

有更快的方法吗?

4

2 回答 2

2

在搜索中添加时间怎么样?

`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 一起使用的虚拟文件

于 2013-01-07T14:09:58.183 回答
1

出于同样的原因,我完全放弃了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 系统。

于 2013-01-07T09:52:05.643 回答