2012-04-25 32 views
11

Tôi có một số tập tin cần thay thế mã thông báo .. thay vì mặc định đơn @, họ sử dụng double @ 's ... Vì vậy, tôi cần các công cụ như: @@ replaceme @@ .. thay thế.Gradle - thay đổi Start/End Token khi sử dụng ReplaceTokens

lọc ReplaceTokens Ant cho phép bạn cài đặt nó sử dụng BeginToken/EndToken .. Mặc dù tôi không chắc chắn làm thế nào để cấu hình nó trong ví dụ của tôi:

copy{ 
    into something 
    from somethingelse 
    filter(ReplaceTokens, tokens: []) 
} 

Làm thế nào tôi có thể thay đổi mã ở trên để thay thế một cách chính xác làm việc với hai @ @ tokens thay vì đơn?

Trả lời

11

Thật dễ dàng để thay đổi các dấu phân cách - chỉ cần thêm các tham số có tên beginTokenendToken vào cuộc gọi phương thức filter. Tuy nhiên, Ant ReplaceTokens chỉ hỗ trợ dấu phân cách đơn ký tự. Tìm kiếm trên web nhanh chóng không bật Ant FilterReader hỗ trợ các dấu phân tách nhiều ký tự tùy ý ra khỏi hộp. Một cách khác là tự mình mã hóa bằng cách triển khai FilterReader hoặc bằng cách sử dụng phương thức tự do filter.

+2

Nice .. Bỏ lỡ sự thiếu hỗ trợ cho các ký tự phân cách không có ký tự đơn lẻ có thể là lý do mã của tôi không hoạt động. – vicsz

10

Tôi đã ở trong một tình huống tương tự (không chính xác). Đã phải xử lý tài nguyên thử nghiệm thuộc tính có định dạng maven. tức là định dạng '$ {}'.

Khi tôi chuyển sang chế độ gradle, tác vụ processTestResources không thay thế các giá trị bằng $ {}. Điều này là do cùng một lý do mà nó sử dụng '@' char đơn giới hạn. Tôi tìm thấy một hack để đạt được những gì tôi muốn.

configure(tasks.processTestResources) { 
    include '**/*.properties' 
    filter(ReplaceTokens, 
      tokens: ['$':'={'], beginToken : '=', endToken : '{') 
    filter(ReplaceTokens, 
      tokens: [project.properties], beginToken : '{', endToken : '}') 
} 
+1

Hoàn toàn hack-y và hoàn toàn hoạt động! Tôi đang sử dụng **/\ * @ TOKEN @ \ */** mã định dạng được định dạng sao cho chúng hợp lệ ở bất kỳ đâu trong CSS/JS và các mẹo sau: 'bộ lọc (org.apache.tools.ant. filters.ReplaceTokens, mã thông báo: ['*': '@'], beginToken: '/', endToken: '@') ' ' bộ lọc (org.apache.tools.ant.filters.ReplaceTokens, mã thông báo: [' * ':' @ '], beginToken:' @ ', endToken:'/') ' – Tyler

0

Đây là giải pháp khác. Sử dụng tác vụ Ant copy thay vì tác vụ sao chép Gradle.

task copyWithMultiCharTokenMark << { 
    ant.copy(todir: 'copy_into_dir') { 
     fileset(dir: 'copy_from_dir') 
     filterset(begintoken:'@@', endtoken:'@@') { 
      filter(token:'replaceme', value:'Am I replaced?') 
     } 
    } 
} 

Tôi tìm thấy cách này trong khi tìm kiếm giải pháp cho vấn đề mã hóa tệp bằng tác vụ sao chép.

5

Những câu trả lời khác dường như là cũ và báo cáo rằng bạn không thể sử dụng đa nhân vật delimiters token. Nhưng tôi đã thấy rằng không phải là trường hợp nữa với Gradle 2.14.1

copy{ 
    into something 
    from somethingelse 
    filter(ReplaceTokens, tokens: [map], beginToken : '@@', endToken : '@@') 
    // or, maven prop stle: 
    // filter(ReplaceTokens, tokens: [map], beginToken : '${', endToken : '}') 

} 
+0

Đã xác nhận làm việc cho tôi. Cảm ơn. – coding

+0

Đây phải là câu trả lời được chấp nhận vì bất kỳ phiên bản nào đã thực hiện thay đổi cho phép các ký tự không phải ký tự duy nhất! – tom01

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