PHP PharData:从目录构建 .tar 存档,带有排除项

Posted

技术标签:

【中文标题】PHP PharData:从目录构建 .tar 存档,带有排除项【英文标题】:PHP PharData: build .tar archive from directory, with exclusions 【发布时间】:2021-07-31 02:44:59 【问题描述】:

TLDR 版本:

如何利用PharData::buildFromIterator/path/to/project/ 构建.tar 存档,但不包括文件列表,如/path/to/project/file0.txt/path/to/project/file1.txt/path/to/project/file2.txt


更长的版本,包括我尝试过的内容:

为了从 dir 路径构建 .tar 存档,我尝试使用简单的 PharData::buildFromDirectory 方法,该方法有第二个可选参数...有点...与我需要的完全相反

"pcre 正则表达式 [...] 只有匹配正则表达式的文件路径才会包含在存档中"

。所以我想,剩下的唯一选择就是使用PharData::buildFromIterator,它有一个简单的用法示例:

$phar->buildFromIterator(
    new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator('/path/to/project', FilesystemIterator::SKIP_DOTS)
    ),
    '/path/to/project'
);

这个例子可能是一个起点,但从这里我不知道如何从迭代器中排除文件列表?

【问题讨论】:

【参考方案1】:

如果有人觉得这个问题有用,我会发布一个答案,因为我已经弄清楚了如何去做,找到了类似问题的解决方案here,感谢用户 Levi Morrison。

(在 Windows 文件系统上测试正常,假设 __DIR__ 是它运行的目录)

$exclude = ['file0.txt', 'file1.txt', 'file2.txt'];

/**
 * @param SplFileInfo $file
 * @param mixed $key
 * @param RecursiveCallbackFilterIterator $iterator
 * @return bool True if you need to recurse or if the item is acceptable
 */
$filter = function ($file, $key, $iterator) use ($exclude) 
    foreach($exclude as $excludefilename)
        if(
            strcmp(__DIR__ . DIRECTORY_SEPARATOR . $excludefilename, $file) === 0
        ) return false;
    
    return true;
;

$innerIterator = new RecursiveDirectoryIterator(
    __DIR__,
    RecursiveDirectoryIterator::SKIP_DOTS
);
$iterator = new RecursiveIteratorIterator(
    new RecursiveCallbackFilterIterator($innerIterator, $filter)
);

$phar = new PharData('project.tar');
$phar->buildFromIterator($iterator, __DIR__);

【讨论】:

以上是关于PHP PharData:从目录构建 .tar 存档,带有排除项的主要内容,如果未能解决你的问题,请参考以下文章

PharData 压缩嵌套原始 tar

使用 phar Stream 写入 PharData 文件

使用 PHP,我如何识别(如果适用,解压缩)并从 .tar、.gz、.tar.gz、.zip 文件中提取文件?

构建LAMP平台(使用xcache-2.0给php加速)

centos7 源码编译安装 php

如何使用 make 从 tgz 文件构建 php 扩展?