【问题标题】:Ant: Rename files to include their MD5Ant:重命名文件以包含其 MD5
【发布时间】:2012-01-04 09:40:51
【问题描述】:

对于熟悉 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 - 目的是用作 webbrowser 缓存破坏器。附加“?[something]”的另一个缓存清除选项不如某些 Google 网站管理员页面上解释的那样好,将 MD5 作为名称的一部分更好。

【问题讨论】:

    标签: ant md5


    【解决方案1】:

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

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

    它执行以下操作:

    • 为每个文件创建一个 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>
    

    【讨论】:

      【解决方案2】:

      您可以执行此操作而无需包含 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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-20
        • 1970-01-01
        • 2014-12-08
        • 2019-10-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多