如何正确要求 phar 文件


How to properly require a phar file

>phpunit 已停止支持 PEAR 安装。 这导致我们需要继续使用 phpunit 的 phar 安装。 我们有一个包装脚本,它遍历许多目录并调用这些目录上的 phpunit 可执行文件。 然后,包装脚本将所有生成的报告合并为单个报告。

当 phpunit 与 PEAR 一起安装时,我们在包装脚本顶部唯一需要的要求是

require 'PHP/CodeCoverage/Autoload.php';

然后,当包装脚本执行类似

$writer = new PHP_CodeCoverage_Report_Clover();
$writer->process($codeCoverage, "${reportsDir}/clover-coverage.xml");

自动加载器将(大概)加载执行此代码所需的任何内容,然后我们将继续我们的快乐方式。

然而,自从转向phar安装以来,事情变得一团糟。 最初,我认为我只需要phar文件本身,一切都会很好。

require 'phpunit-3.7.31.phar';

但是,这导致 phar 文件在点击 require 行后立即执行,从而中止带有 phpunit 用法输出的包装脚本。 由于你不能在 php require 语句中使用通配符,所以我慢慢地构建了一个完成包装脚本所需的文件列表,并像这样需要它们:

require 'phar://phpunit-3.7.31.phar/php-code-coverage/CodeCoverage/Report/Clover.php';

当我从它的目录中执行包装脚本并且 phpunit.phar 文件位于同一目录中时,这有效。 但是,尝试从其他目录执行它将失败,因为 phar 文件未在包含路径上找到。 我尝试更改包含路径,将 .phar 文件放在包含路径上已有的位置,并在包含中提供 phar 文件的绝对路径,例如:

require 'phar://actual/path/to/file/phpunit-3.7.31.phar/php-code-coverage/CodeCoverage/Report/Clover.php';

这些解决我问题的尝试都没有奏效。

如何以允许我从系统上的任何位置运行脚本的方式包含 .phar 文件中的文件?

另一个可接受的答案是允许我使用 phar 文件中的类,而无需单独包含我需要的所有内容。

乌班图12.04

PHPUnit 3.7.31(我们必须保留这个版本,但这并不真正影响问题)

PHPUnit 的 PHAR 只能从 PHPUnit 4.2 中正确用作库。

另请查看 PHPCOV 用于合并来自多次运行的代码覆盖率数据。