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

Mör*_*rre 5 ant md5

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

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

<copy todir="build/css/">
    <fileset dir="css/">
        <include name="*.css"/>
    </fileset>
    <globmapper from="*.css" to="*-min.css"/>
</copy>
Run Code Online (Sandbox Code Playgroud)

我知道如何计算MD5:

<checksum file="foo.bar" property="foobarMD5"/>
Run Code Online (Sandbox Code Playgroud)

我不知道如何将第二个包含到第一个,重命名所有这些文件以包含他们的MD5 - 目的是作为webbrowser缓存破坏者.另一个缓存破坏选项,附加"?[某事]"并不像在某些Google网站管理员页面上所解释的那样好,将MD5作为名称的一部分更好.

Jam*_*and 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>
Run Code Online (Sandbox Code Playgroud)

值得注意的是,我是为 Java 8 编写的,但经过一些小的调整,它可以在 Java 7 上运行。遗憾的是,如果不付出更多努力,这不适用于早期版本的 Java。