2012-01-04 37 views
5

La pregunta es MUY trivial para cualquiera que esté familiarizado con hormiga, de la cual solo uso lo básico hasta ahora.Ant: Renombrar archivos para incluir su MD5

Sé cómo cambiar el nombre de los archivos, p. Ya utilizo:

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

sé cómo calcular un MD5:

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

No sé cómo incluir la segunda a la primera, cambiar el nombre de todos los archivos para incluir su MD5 - el propósito es servir como destructor de memoria caché webbrowser. La otra opción de almacenamiento en memoria caché, para agregar "? [Algo]" no es tan buena, como se explica en algunas páginas webmaster de Google, teniendo el MD5 como parte del nombre es mejor.

Respuesta

1

Usted puede hacer esto sin tener que incluir ant contrib. Tuve que implementar esto para el trabajo y no se me permitió introducir esa extensión por razones de seguridad. La solución fue que llegué a esto:

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

Vale la pena señalar que escribí esto para Java 8, pero con algunos ajustes menores que podía trabajar en Java 7. Lamentablemente, esto no funcionará para las versiones anteriores de Java sin más esfuerzo.

2

Me las arreglé para producir una solución algo extraña usando for from ant contrib.
Pero primero tiene que install ant contrib.

El copy en el sequential no parece aceptar/evaluar mappers (que no funcionaría, he intentado con la hormiga 1.7.0), así que tuve que crear un extra move con un filtermapper para crear los resultados.

Se hace lo siguiente:

  • para cada archivo de crear un md5sum y guardarlo en la propiedad foobarMD5
  • la propiedad tiene que ser desarmado antes de cada iteración
  • puedo crear un nuevo archivo en el mismo dir llamado example.java_foobarMD5.java (Observe que el nombre de archivo contiene la FileExtension)
  • muevo todos los archivos con .java_ en su nombre a una nueva carpeta y eliminar la .java_

Dejo este ejemplo con .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> 

Cuestiones relacionadas