2012-01-04 16 views
5

Pytanie jest prawdopodobnie BARDZO trywialne dla każdego, kto zna mrówki, z których do tej pory używam tylko podstaw.Ant: Zmień nazwy plików na ich MD5

Wiem, jak zmienić nazwy plików, np. I już używać:

<copy todir="build/css/"> 
    <fileset dir="css/"> 
     <include name="*.css"/> 
    </fileset> 
    <globmapper from="*.css" to="*-min.css"/> 
</copy> 

wiem, jak obliczyć MD5:

<checksum file="foo.bar" property="foobarMD5"/> 

nie wiem jak włączyć drugi do pierwszego, aby zmienić wszystkie te pliki do włączenia ich MD5 - celem jest służyć jako przeglądarka pamięci podręcznej przeglądarki. Inna opcja pomijania pamięci podręcznej, aby dodać "? [Coś]", nie jest tak dobra, jak to wyjaśniono na niektórych stronach webmasterów Google, ponieważ MD5 jako część nazwy jest lepsza.

Odpowiedz

1

Można to zrobić bez konieczności włączania ant contrib. Musiałem to zaimplementować do pracy i nie mogłem wprowadzić tego rozszerzenia ze względów bezpieczeństwa. Rozwiązanie Przyszedłem było to:

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

Warto zauważyć, że napisałem to dla Javy 8, ale z niewielkimi szczypie to może pracować na Java 7. Niestety to nie będzie działać dla wcześniejszych wersji Javy bez więcej wysiłku.

2

Udało mi się stworzyć nieco dziwne rozwiązanie, używając for from ant contrib. Najpierw musisz install ant contrib.

copy w sequential nie wydaje się, aby zaakceptować/oceny mappers (to nie działa, próbowałem z ant 1.7.0), więc musiałem stworzyć dodatkową move z filtermapper stworzyć wyniki.

Czyni następujące:

  • dla każdego pliku utworzyć md5 i zapisać go w nieruchomości foobarMD5
  • właściwość musi być wyłączony przed każda iteracja
  • utworzyć nowy plik w tym samym dir nazwie example.java_foobarMD5.java (Zauważ, że nazwa pliku zawiera fileextension)
  • przenieść wszystkie pliki z .java_ w jego imieniu do nowego folderu i usunąć .java_

Zostawiam ten przykład z .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> 

Powiązane problemy