我正在尝试从Web应用程序中创建一个.phar文件。在php documentation's example之后,我为此尝试了以下方法。
<?php
$srcRoot = __DIR__ . "/../app";
$buildRoot = __DIR__ . "/../build";
$p = new Phar("$buildRoot/build.phar", 0, 'build.phar');
$p->buildFromIterator(
new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($srcRoot)
),
$srcRoot
);
但是我收到以下错误。我对此错误一无所知。代码有什么问题?
PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message
'Iterator RecursiveIteratorIterator returned a path "D:\site\app" that is
not in the base directory "D:\site\app"'
in D:\site\tools\create-phar.php:7
问题的根源是RecursiveDirectoryIterator
还列出了点文件-RecursiveDirectoryIterator
和.
。遍历..
时,它还会列出/path/to/foo
和/path/to/foo/.
,它们转到父目录-基本目录之外。
因此,您必须防止包含“ ..”文件,这是最容易实现的,使用/path/to/foo/..
作为DirectoryIterator的第二个参数:
FilesystemIterator::SKIP_DOTS
((@ cweiske-我刚刚意识到您对我很满意,我将确保下次再次刷新页面,由衷的歉意!)
您只需稍作修改即可跳过Unix路径/。和/ ..:
FilesystemIterator::SKIP_DOTS
new RecursiveDirectoryIterator($srcRoot, FilesystemIterator::SKIP_DOTS)
使从源文件创建PHAR存档变得非常容易。基本上,您首先要添加一个配置文件,然后只需在命令行中调用<?php
$srcRoot = __DIR__ . "/../app";
$buildRoot = __DIR__ . "/../build";
$p = new Phar("$buildRoot/build.phar", 0, 'build.phar');
$p->buildFromIterator(
new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($srcRoot, FilesystemIterator::SKIP_DOTS)
),
$srcRoot
);
即可创建PHAR文件。
[Matthieu Moquet的Box描述了他如何使用Box简化PHP Cli应用程序的分发。就个人而言,我也一直在将Box用于CLI应用程序,但是官方项目说明不限于CLI应用程序,而是将Box项目总结为:
用于构建和管理Phars的应用程序。
Box项目提供PHAR构建脚本并负责正确设置所有路径,因此这可以解决您的问题。
box build
提出的解决方案很棒。但是,在某些情况下,您可能需要能够添加更多目录路径排除项。看一下使用great blog post排除所有对@cweiske目录的引用的示例:
.git
查看php.ini文件,检查phar.readonly字段的值。创建phar存档必须为0。
参考:FilterIterator