对于熟悉蚂蚁的人来说,这个问题可能非常微不足道,到目前为止我只使用了基础知识。
我知道如何重命名文件,例如我已经使用了:
<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作为名称的一部分更好。
答案 0 :(得分:2)
我设法使用for from ant contrib制作了一个有点奇怪的解决方案 但你必须先install ant contrib。
copy
中的sequential
似乎不接受/评估mappers
(这不起作用,我尝试使用ant 1.7.0),所以我必须创建一个带有filtermapper的额外move
来创建结果。
它执行以下操作:
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不起作用。