2012-01-04 34 views
5

Câu hỏi này có khả năng rất nhỏ đối với bất kỳ ai quen thuộc với kiến, trong đó tôi chỉ sử dụng các khái niệm cơ bản cho đến nay.Kiến: Đổi tên các tệp để bao gồm MD5

Tôi biết cách đổi tên tệp, ví dụ: Tôi đã sử dụng:

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

tôi biết làm thế nào để tính toán một MD5:

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

Tôi không biết làm thế nào để bao gồm các thứ hai vào đầu tiên, để đổi tên tất cả các tập tin để bao gồm MD5 của họ - mục đích là để phục vụ như là cache webbrowser cache. Tùy chọn ngăn chặn bộ nhớ cache khác, để nối "? [Cái gì đó]" không tốt, như được giải thích trên một số trang quản trị trang web của Google, có MD5 như một phần của tên là tốt hơn.

Trả lời

1

Bạn có thể làm điều này mà không cần phải bao gồm ant contrib. Tôi đã phải thực hiện điều này cho công việc và không được phép giới thiệu phần mở rộng đó vì lý do bảo mật. Giải pháp tôi đến là:

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

Điều đáng lưu ý là tôi đã viết điều này cho Java 8 nhưng với một số chỉnh sửa nhỏ có thể hoạt động trên Java 7. Đáng buồn là điều này sẽ không hoạt động đối với các phiên bản Java trước đó nỗ lực nhiều hơn.

2

Tôi đã quản lý để tạo ra một giải pháp hơi lạ bằng cách sử dụng for from ant contrib.
Nhưng trước tiên bạn phải install ant contrib.

Các copy trong sequential dường như không chấp nhận/đánh giá mappers (nó sẽ không làm việc, tôi đã cố gắng với 1.7.0 ant), vì vậy tôi đã phải tạo ra thêm một move với một filtermapper để tạo ra các kết quả.

Nó làm như sau:

  • cho mỗi tập tin tạo ra một md5sum và lưu nó trong bất động sản foobarMD5
  • tài sản này phải được unset trước mỗi lần lặp
  • tôi có thể tạo một tập tin mới trong cùng dir có tên example.java_foobarMD5.java (Lưu ý rằng tên tệp chứa fileextension)
  • Tôi di chuyển tất cả các tệp bằng .java_ trong tên của nó sang một Thư mục mới và xóa .java_

Tôi để ví dụ này với .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> 

Các vấn đề liên quan