netglue/revs

用于更改文件版本名称和删除旧版本的简单工具

1.4.0 2023-12-01 12:30 UTC

README

Continuous Integration

可能在这里重新发明轮子,但我想要能够以可预测的方式更改前端资源文件名,并具有自动删除旧版本(保留全部或指定数量的最新版本)的选项。有一些javascript工具可以这样做,但在写作的时候,我找不到任何我喜欢的JS工具,你可以很容易地从npm包脚本中启动。如果你使用Grunt和Gulp,那么这里有很多。

此库的主要用例是触发你的 package.json 中的脚本,如下所示

{
    "scripts": {
        "css:rev": "vendor/bin/rev netglue:rev -s \"build/css/*.css\" -t \"public/assets/css\" -d -c 1 -r \"module/layouts/*.phtml\""
    }
}

使用composer安装

composer require netglue/revs

为了使用这些工具,请确保你已经 require 了composers的 vendor/autoload.php,或者 使用随附的二进制文件vendor/bin/rev

操作

假设你有一个文件在 /my/frontend/whatever.css,你想要一个哈希文件名在 /my/public/assets/{hashed-file-name}.css,你会这样做

use Netglue\Revs\Revver;
use Netglue\Revs\RevverOptions;
use Netglue\Revs\RevvedFile;

$options = new RevverOptions();
$options->setDestinationDirectory('/my/public/assets');
$revver = new Revver($options);
/** @var RevvedFile $result */
$result = $rever->revFile('/my/frontend/whatever.css');
var_dump($result->destination()); // Yields the full path and filename of the copied file.

选项对象可以接受如下的数组

use Netglue\Revs\RevverOptions;
$options = RevverOptions::fromArray([
    'destinationDirectory' => '/my/public/assets',
    'clean_up' => true,
    'revision_count' => 10,
]);

默认情况下,不会删除旧版本,因此修订版本计数参数无关紧要。你必须明确启用它。

生成的文件名

是的,它们相当长,因为它们是由 original-filename-{md5 hash}-{UUID1}.extension 组成的 - 文件名包括基于时间的UUID,因此可以计算出文件生成时的准确时间,因此可以对这些文件进行排序,并确保在适当的时候删除最旧的版本。可能需要去掉md5散列,但这是用来确定文件是否实际更改的方法。如果在操作之间散列没有变化,则过程会停止。

删除旧版本

在选项中指定“修订版本计数”并将清理设置为true,将在目标目录中保留这么多旧版本。因此,修订版本计数为1时,将具有当前和下一个最近的版本。

Revver::revFile() 的返回值可以告诉你任何已删除文件的路径,如果你感兴趣的话。

在文件中替换...

假设你有一些文件需要更新对这些“revved”文件名的引用,你可以使用 \Netglue\Revs\Revver::revFile() 的返回值来执行字符串替换,或在磁盘上的另一个文件中进行替换,例如

use Netglue\Revs\Revver;
use Netglue\Revs\RevvedFile;
use Netglue\Revs\Replacer;

/** @var RevvedFile $result */
$result = $rever->revFile('/my/frontend/whatever.css');
$replacementCount = Replacer::replaceInFile('/my/layout.html', $result);
// …or…
$resultingString = Replacer::replaceInString($someString, $result, $count);
// $count is an int with the number of replacements

组合起来

假设你以某种方式收到通知,你的JS构建到一个位于 /build/index.js 的文件中,并且你想要将其复制到 /public/assets 并带有revved文件名,并更新 /public 中的所有html文件以使用新的文件名

$options = RevverOptions::fromArray([
    'destinationDirectory' => '/public/assets',
    'cleanUp' => true,
    'revisionCount' => 1,
]);
$revver = new Revver($options);
$info = $revver->revFile('/build/index.js');
printf(
    "New revision of %s copied to %s. %d old revisions deleted\n",
     basename($info->source()),
     dirname($info->destination()),
     count($info->deletedRevisions())
);
$count = 0;
$files = glob('/public/*.html');
foreach ($files as $html) {
    $count += Replacer::replaceInFile(sprintf('/public/%s', $html), $info);
}
printf('Replaced %d references over %d files', $count, count($files));

Symfony命令

安装后,Composer将在 vendor/bin/rev 中创建一个二进制文件,你可以从构建脚本中调用它。命令本身有直接的帮助,所以只需输入 vendor/bin/rev netglue:rev --help 即可获取选项的概述。

测试

转到模块安装的任何位置,输入 composer install 后跟 composer check

贡献

PR是受欢迎的。请为新功能编写测试。

支持

欢迎提交问题,但请理解,找到时间来回答支持请求非常有限,因此可能会有很长的等待时间才能得到答复。

关于

Netglue 在英国德文郡制作网站和应用程序。我们希望这对您有帮助,无论哪种情况我们都非常欢迎您的反馈 :)