Ant:重命名文件以包含其MD5

时间:2012-01-04 09:40:51

标签: ant md5

对于熟悉蚂蚁的人来说,这个问题可能非常微不足道,到目前为止我只使用了基础知识。

我知道如何重命名文件,例如我已经使用了:

<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 - 目的是作为webbrowser缓存破坏者。其他缓存破坏选项,附加“?[某事]”并不像在某些Google网站管理员页面上所解释的那样好,将MD5作为名称的一部分更好。

2 个答案:

答案 0 :(得分:2)

我设法使用for from ant contrib制作了一个有点奇怪的解决方案 但你必须先install ant contrib

copy中的sequential似乎不接受/评估mappers(这不起作用,我尝试使用ant 1.7.0),所以我必须创建一个带有filtermapper的额外move来创建结果。

它执行以下操作:

  • 为每个文件创建一个md5sum并将其保存在属性foobarMD5
  • 必须在每次迭代之前取消设置属性
  • 我在名为dir的同一example.java_foobarMD5.java中创建了一个新文件(注意文件名包含fileextension)
  • 我将名称中包含.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 :(得分:1)

您可以在不必包含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不起作用。