2012-01-04 13 views
5

質問はおそらく、これまでのところ基本的なものを使用している、antに精通している人にとっては非常に些細なことでしょう。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を含める - 目的は、Webブラウザのキャッシュバスターとして機能することです。他のキャッシュ無効化オプションは、「?[何か]」を追加すると、一部のGoogleウェブマスターページで説明されているように、MD5を名前の一部として使用する方が良いとは言えません。

答えて

1

あなたはant contribを含めることなく、これを行うことができます。私は仕事のためにこれを実装しなければならず、セキュリティ上の理由からその拡張を導入することは許されませんでした。それは、私は、Java 8のためにこれを書いたことは注目に値するが、いくつかのマイナーな改良と、それは悲しいことに、これはなしでのJavaの以前のバージョンでは動作しませんのJava 7に仕事ができる

<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> 

:私が来たソリューションは、このましたより多くの努力。

2

私はfor from ant contribを使ってやや奇妙な解決法を作り出しました。
しかし、最初にinstall ant contribする必要があります。

sequentialcopymappersを評価/受け入れていないようです(それが動作しないだろう、私はアリ1.7.0で試してみました)ので、私は結果を作成するためにfiltermapperで余分moveを作成する必要がありました。

それは以下のん:各ファイルの

  • のmd5sumを作成し、プロパティにそれを保存foobarMD5
  • プロパティは、各反復
  • は、私が同じに新しいファイルを作成する前に、設定を解除しなければならdirexample.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> 

関連する問題