2014-05-08 26 views
16

tôi xác định một nhiệm vụ trong gradle:Gradle nhiệm vụ không nên thực hiện tự động

task releaseCandidate(type: Exec) { 
    commandLine 'git', 'checkout', 'develop' 

    // Increment version code in Manifest 
    String manifest = new File('AndroidManifest.xml').getText('UTF-8') 
    Pattern pattern = Pattern.compile('android:versionCode="([0-9]+)"') 
    Matcher matcher = pattern.matcher(manifest) 
    matcher.find() 
    int newVersionCode = Integer.parseInt(matcher.group(1)) + 1 
    manifest = manifest.replaceAll(
     "android:versionCode=\"([0-9]+)\"", "android:versionCode=\"$newVersionCode\"" 
    ) 
    new File('AndroidManifest.xml').write(manifest, 'UTF-8') 

    commandLine 'git', 'diff' 
} 

Mà tôi muốn thực hiện chỉ khi tôi dứt khoát gọi nó như gradle releaseCandidate. Tuy nhiên, khi tôi chạy bất kỳ tác vụ nào khác, chẳng hạn như gradle assembleDebug, nó cũng chạy nhiệm vụ releaseCandidate. Tôi không muốn hành vi đó xảy ra. Không có nhiệm vụ tùy thuộc vào releaseCandidate hoặc ngược lại.

Dự án của tôi là một ứng dụng Android, vì vậy tôi đang sử dụng android plugin gradle.

Trả lời

33

Một sự cố thường gặp. Thêm một hành động vào tác vụ nếu không mã sẽ chạy ở giai đoạn cấu hình. Tác vụ mẫu có hành động:

task sample << { 
} 

Như tôi thấy, bạn cần viết công việc tùy chỉnh hơn là sử dụng loại Exec. Tôi cho rằng nó không hợp lệ để xác định commandLine hai lần.

+0

chính xác. Tôi đã biết về lối tắt '<<', nhưng các tài liệu đã không làm cho hành vi đó trong giai đoạn cấu hình rõ ràng. –

+0

Vâng, ok. Bạn có biết cách định cấu hình ngay bây giờ không? Nếu không cảm thấy tự do để đặt câu hỏi thêm. – Opal

+0

Vâng, cảm ơn. :) –

10

Bạn đang trộn cấu hình Nhiệm vụ và mã groovy. Mọi thứ là một phần của phần chính của một định nghĩa nhiệm vụ sẽ được thực thi trong pha cấu hình. Các task task1 << { code } là viết tắt của


task task1 { 
    doLast { 
    code 
    } 
} 

commandLine là một phần của Exec Task nhưng mã khác bạn không phải là và cần được gói gọn trong một doLast này sẽ thực hiện lệnh đầu tiên và sau đó thực thi mã bổ sung của bạn. Nếu bạn cần một exec khác commandLine thì bạn sẽ cần một nhiệm vụ khác.


task releaseCandidate(type: Exec) { 
    commandLine 'git', 'checkout', 'develop' 

    doLast { 
    // Increment version code in Manifest 
    String manifest = new File('AndroidManifest.xml').getText('UTF-8') 
    Pattern pattern = Pattern.compile('android:versionCode="([0-9]+)"') 
    Matcher matcher = pattern.matcher(manifest) 
    matcher.find() 
    int newVersionCode = Integer.parseInt(matcher.group(1)) + 1 
    manifest = manifest.replaceAll(
     "android:versionCode=\"([0-9]+)\"", "android:versionCode=\"$newVersionCode\"" 
    ) 
    new File('AndroidManifest.xml').write(manifest, 'UTF-8') 
    } 
} 
1

Chỉ cần để hoàn thành câu trả lời @Opal đối với trường hợp khi Exec thực sự được sử dụng (ví dụ commandline tham khảo):

task task1 << { 
    exec { 
     List<String> arguments = new ArrayList<String>() 
     //.. 
     commandLine arguments 
    } 
} 
Các vấn đề liên quan