2015-05-04 23 views
11

Tôi muốn thay thế mã thông báo @[email protected] trong tệp nguồn java bằng phiên bản trước khi xây dựng (Gradle là hệ thống xây dựng của tôi).Thay thế mã thông báo trong tệp trước khi tạo, nhưng giữ mã thông báo trong các nguồn

Trong tập lệnh hiện tại ant.replace(file: 'src/main/java/randers/notenoughvocab/main/Reference.java', token: '@[email protected]', value: version), nó thay thế các lần xuất hiện của @[email protected] trong tệp nguồn thực, sau khi xây dựng tất cả các lần xuất hiện của mẫu đã được thay thế bằng phiên bản và nếu tôi thay đổi phiên bản còn tìm thấy bất kỳ mẫu nào trong đó và phiên bản sẽ không cập nhật.

Tôi cũng đã thấy một nhiệm vụ here, nhưng tôi không nhận được giá trị nào cần được áp dụng cho dự án cụ thể của mình.

Cách bố trí dự án cho dự án của tôi, nếu điều đó là cần thiết:
Screenshot of file layout taken from IntelliJ IDEA 14.1.2, Dark theme

My gradle build file: View on github

Trả lời

9

Bạn chỉ cần phải thay thế @[email protected] thẻ trước khi phát hành phần mềm của bạn cho công chúng. Ở đây tôi được xác định là một nhiệm vụ compileForRelease mà hoàn thành nó:

import org.apache.tools.ant.filters.ReplaceTokens 

task sourcesForRelease(type: Copy) { 
    from 'src/main/java' 
    into 'build/adjustedSrc' 
    filter(ReplaceTokens, tokens: [VERSION: '2.3.1']) 
} 

task compileForRelease(type: JavaCompile, dependsOn: sourcesForRelease) { 
    source = sourcesForRelease.destinationDir 
    classpath = sourceSets.main.compileClasspath 
    destinationDir = file('build/adjustedClasses') 
} 

tôi không khuyên bạn nên rối tung với nhiệm vụ tiêu chuẩn được xác định bởi các plugin Java vì đó sẽ làm tăng thêm chi phí không cần thiết để mỗi xây dựng.

+0

@ RAnders00 đó là dự án của bạn - dù sao đề xuất của Opal là một cách thực sự kỳ lạ để đạt được mục tiêu của bạn. Tôi muốn bạn đã thử thay thế sạch hơn tôi đề xuất trong câu trả lời này. Nó thậm chí còn dễ hiểu hơn, và bạn chỉ cần bỏ mười dòng mã Groovy và gõ '. \ Gradlew doc' – Raffaele

+0

@ RAnders00 trong thực tế gradlew build nên ** KHÔNG ** chạm vào thư mục làm việc (xem bình luận cho câu trả lời của Opal). Thư mục adjustSrc chứa các tệp nguồn có mã thông báo được thay thế và sau đó được nạp vào tài liệu nhiệm vụ để tạo các javadocs (và bạn có thể làm điều tương tự để tạo ra các tệp jar .class) – Raffaele

+0

Vấn đề trong việc làm rối các nhiệm vụ tiêu chuẩn (như compileJava) là bạn thêm phí thay thế ** cho mỗi bản dựng **. Thực hành không tốt. Các bản dựng nên càng nhanh càng tốt và bạn chỉ cần thay thế khi phát hành (ví dụ sau này bạn có thể thêm máy chủ CI có thể không cần bước lọc - Chu trình CPU là tài nguyên khan hiếm!) – Raffaele

5

CẢNH BÁO: Như đã nêu trong ý kiến ​​của mã nguồn lọc @Raffaele có thể dẫn đến nghiêm trọng các vấn đề. Câu trả lời này giả định rằng bạn biết rõ bạn đang làm gì và có ý thức về các vấn đề tiềm ẩn có thể xảy ra.

Sự cố là trong thực tế các tệp nguồn java không được sao chép - chúng chỉ được biên soạn - tại chỗ. Vì vậy, bạn cần phải:

  1. Trước khi biên soạn - sao chép các tập tin có chứa @[email protected]
  2. Lọc tập tin.
  3. biên dịch
  4. Khôi phục tệp gốc.

Không chắc về đường dẫn nhưng đoạn mã sau đây sẽ hữu ích:

apply plugin: 'java' 

version = '0.0.1' 
group = 'randers.notenoughvocab' 
archivesBaseName = 'NotEnoughVocab' 

def versionFile = 'src/main/java/randers/notenoughvocab/main/Reference.java' 
def tempDir = 'build/tmp/sourcesCache' 
def versionFileName = 'Reference.java' 

compileJava.doFirst { 
    copy { 
     from(versionFile) 
     into(tempDir) 
    } 
    ant.replace(file: versionFile, token: '@[email protected]', value: version) 
} 

compileJava.doLast { 
    copy { 
     from(tempDir + '/' + versionFileName) 
     into(project.file(versionFile).parent) 
    } 
} 
+0

@ RAnders00, vâng tôi vừa viết cách triển khai :) – Opal

+0

@ RAnders00, xem câu trả lời cập nhật của tôi. – Opal

+1

Tôi sẽ sao chép toàn bộ mã. – Opal

1

Tôi phải đối mặt với cùng một vấn đề. Và tôi không thể tìm ra giải pháp làm việc. Không có ví dụ nào tôi tìm được. Tôi tin rằng nó có thể là một thực tế, rằng tôi mới đến Gradle và những ví dụ bỏ qua một số đoạn mã rõ ràng. Vì vậy, tôi nhìn vào Gradle và tìm thấy giải pháp của riêng tôi, mà tôi muốn chia sẻ:

import org.apache.tools.ant.filters.ReplaceTokens 

// Change compiler source directory 
sourceSets { 
    main { 
     java { 
      srcDirs = ['build/src/main/java'] 
     } 
    } 
} 

// Prepare sources for compilation 
task prepareSources(type: Copy) { 
    from('src/main/java') 
    into('build/src/main/java') 
    filter(ReplaceTokens, tokens: [pluginVersion: version]) 
} 

// Prepare sources, before compile 
compileJava { 
    dependsOn prepareSources 
} 
+0

Điều này làm việc cho tôi. Lưu ý rằng tôi cần thiết để 'xây dựng lại' dự án mặc dù tôi đang làm hơi khác nhau. –

1

Để bổ sung cho câu trả lời khác, 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/main/java' 
    into 'build/src/main/java' 
    filter { line -> line.replaceAll('xxx', 'aaa') } 
} 
Các vấn đề liên quan