2015-11-01 15 views
6

Tôi muốn thay thế vài dòng trong tệp Config.java trước khi mã được biên dịch. Tất cả những gì tôi có thể tìm được là phân tích tập tin thông qua bộ lọc trong khi sao chép nó. Ngay sau khi tôi phải sao chép nó, tôi phải lưu nó ở đâu đó - đó là lý do tại sao tôi đi giải pháp: sao chép vào vị trí tạm thời trong khi thay thế dòng> xóa tập tin gốc> sao chép tập tin trùng lặp trở lại vị trí ban đầu> xóa tập tin tạm thời. Có giải pháp tốt hơn không?Tác vụ Gradle thay thế chuỗi trong tập tin .java

Trả lời

8

Có thể bạn nên thử một cái gì đó giống như con kiến ​​của replaceregexp:

task myCopy << { 
    ant.replaceregexp(match:'aaa', replace:'bbb', flags:'g', byline:true) { 
     fileset(dir: 'src/main/java/android/app/cfg', includes: 'TestingConfigCopy.java') 
    } 
} 

Nhiệm vụ này sẽ thay thế tất cả các lần xuất hiện của aaa với bbb. Dù sao, nó chỉ là một ví dụ, bạn có thể sửa đổi nó theo mục đích của bạn hoặc thử một số giải pháp tương tự với kiến.

+0

Xem aproach khác tại địa chỉ: [http: // stackoverflow.com/a/17572644/890357](http://stackoverflow.com/a/17572644/890357) – marciowb

3
  1. Tôi chắc chắn sẽ không ghi đè lên file gốc
  2. Tôi muốn giữ cho mọi thứ thư mục dựa chứ không phải là tên tập tin dựa vì vậy nếu nó đã được tôi, tôi muốn đưa Config.java trong thư mục riêng của nó (ví dụ src/replaceme/java)
  3. Tôi muốn tạo một thư mục generated-src dưới $buildDir để nó bị xóa qua nhiệm vụ clean.

Bạn có thể sử dụng tác vụ Sao chép và bộ lọc ReplaceTokens. Ví dụ:

apply plugin: 'java' 
task generateSources(type: Copy) { 
    from 'src/replaceme/java' 
    into "$buildDir/generated-src" 
    filter(ReplaceTokens, tokens: [ 
     'xxx': 'aaa', 
     'yyy': 'bbb' 
    ]) 
} 
// the following lines are important to wire the task in with the compileJava task 
compileJava.source "$buildDir/generated-src" 
compileJava.dependsOn generateSources 
+0

Tôi đã sử dụng phương pháp thay thế và hoạt động của nó hoàn hảo nhưng sau khi tôi chỉnh sửa tệp Config.java theo cách thủ công, tôi có thể tiếp cận một số tệp không mong muốn tiểu bang, vì vậy giải pháp của bạn có vẻ tốt hơn nhiều. Chính xác compileJava.source = [tệp] làm gì? Làm cách nào để biết liệu tôi có muốn thay thế Config.java trong cho phép nói gói 'com.example.cfg' chứ không phải tệp có cùng tên trong gói 'com.example.remote.cfg' không? – Srneczek

+0

Như tôi đã nói, tôi thích sử dụng các thư mục hơn là các mẫu tên tập tin cụ thể. Vì vậy, trong ví dụ của tôi tất cả mọi thứ trong 'src/replaceme/java' sẽ được thay thế bất kể gói. 'compileJava.source generateSources.outputs.files' gọi [JavaCompile.source (...)] (https://docs.gradle.org/current/javadoc/org/gradle/api/tasks/compile/JavaCompile.html) mà cuối cùng thêm các nguồn được tạo ra để chúng được biên dịch cùng với các tệp nguồn bình thường (trong 'src/main/java'). Không có dấu "=" trong đề xuất của tôi –

1

Để bổ sung cho lance-java 's câu trả lời, tôi thấy thành ngữ này đơn giản hơn nếu chỉ có một giá trị mà bạn đang tìm kiếm để thay đổi:

task generateSources(type: Copy) { 
    from 'src/replaceme/java' 
    into "$buildDir/generated-src" 
    filter { line -> line.replaceAll('xxx', 'aaa') } 
} 
Các vấn đề liên quan