Ant: переименование файлов, чтобы включить их MD5 - PullRequest
5 голосов
/ 04 января 2012

Вопрос, вероятно, ОЧЕНЬ тривиален для всех, кто знаком с ant, и пока я использую только основы.

Я знаю, как переименовывать файлы, например, я уже использую:

<copy todir="build/css/">
    <fileset dir="css/">
        <include name="*.css"/>
    </fileset>
    <globmapper from="*.css" to="*-min.css"/>
</copy>

Я знаю, как рассчитать MD5:

<checksum file="foo.bar" property="foobarMD5"/>

Я не знаю, как включить второе в первое , чтобы переименовать все эти файлы, чтобы включить их MD5 - цель состоит в том, чтобы служить кеша веб-браузера.Другой вариант очистки кэша, добавлять «? [Что-то]» не так хорошо, как объясняется на некоторых страницах Google для веб-мастеров, лучше использовать MD5 в качестве части имени.

Ответы [ 2 ]

2 голосов
/ 04 января 2012

Мне удалось создать несколько странное решение, используя для от ant contrib .
Но сначала нужно установить ant contrib .

copy в sequential, похоже, не принимает / оценивает mappers (это не сработает, я попробовал с муравьем 1.7.0), поэтому мне пришлось создать дополнительный move с фильтром для создания результатов.

Он выполняет следующие действия:

  • для каждого файла создает md5sum и сохраняет его в свойстве foobarMD5
  • свойство должно быть сброшено перед каждой итерацией
  • Я создаю новый файл с тем же dir именем example.java_foobarMD5.java (обратите внимание, что имя файла содержит расширение файла)
  • Я перемещаю все файлы с .java_ в его имени в новую папку и удаляю.java_

Я оставляю этот пример с .java.

<for param="file">
  <path>
    <fileset dir="src/" includes="**/*.java"/>
  </path>
  <sequential>
    <echo>Letter @{file}</echo>
    <var name="foobarMD5" unset="true"/>
    <checksum file="@{file}" property="foobarMD5"/>
    <echo>${foobarMD5}</echo>
    <copy file="@{file}" tofile="@{file}_${foobarMD5}.java"/>
  </sequential>
</for>

<move todir="teststack" verbose="true">
  <fileset dir="src/">
    <include name="**/*java_*"/>
  </fileset>
  <filtermapper>
    <replacestring from=".java_" to="-"/>
  </filtermapper>
</move>

1 голос
/ 26 мая 2016

Вы можете сделать это без включения ant contrib.Мне пришлось реализовать это для работы, и мне не разрешили ввести это расширение по соображениям безопасности.Решение, к которому я пришел, было следующее:

<target name="appendMD5">
    <copy todir="teststack">
        <fileset dir="css/" includes="**/*.css"/>
        <scriptmapper language="javascript"><![CDATA[
            var File = Java.type('java.io.File');
            var Files = Java.type('java.nio.file.Files');
            var MessageDigest = Java.type('java.security.MessageDigest');
            var DatatypeConverter = Java.type('javax.xml.bind.DatatypeConverter');

            var buildDir = MyProject.getProperty('builddir');
            var md5Digest = MessageDigest.getInstance('MD5');
            var file = new File(buildDir, source);
            var fileContents = FIles.readAllBytes(file.toPath());

            var hash = DatatypeConverter.printHexBinary(md5Digest.digest(fileContents));
            var baseName = source.substring(0, source.lastIndexOf('.'));
            var extension = source.substring(source.lastIndexOf('.'));

            self.addMappedName(baseName + '-' + hash + extension);
        ]]></scriptmapper>
    </copy>
</target>

Стоит отметить, что я написал это для Java 8, но с некоторыми незначительными изменениями он может работать на Java 7. К сожалению, это не будет работать для более ранних версийJava без особых усилий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...