netglue / revs
用于更改文件版本名称和删除旧版本的简单工具
Requires
- php: ~8.1 || ~8.2 || ~8.3
- ramsey/uuid: ^4
- symfony/console: ^5 || ^6 || ^7
- webmozart/assert: ^1.11
Requires (Dev)
- doctrine/coding-standard: ^12.0.0
- phpunit/phpunit: ^10.5.0
- psalm/plugin-phpunit: ^0.18.4
- squizlabs/php_codesniffer: ^3.7.2
- vimeo/psalm: ^5.16
README
可能在这里重新发明轮子,但我想要能够以可预测的方式更改前端资源文件名,并具有自动删除旧版本(保留全部或指定数量的最新版本)的选项。有一些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 在英国德文郡制作网站和应用程序。我们希望这对您有帮助,无论哪种情况我们都非常欢迎您的反馈 :)