2013-07-12 31 views
24

Tôi đang thực hiện một nhiệm vụ trong gradle cần gọi một số nhiệm vụ khác.Nhiệm vụ Gradle để gọi các nhiệm vụ khác theo thứ tự

Dưới đây là những gì tôi có:

task ci(dependsOn: [ 
    clean, 
    build, 
    test 
]) 

gì là lạ là sản phẩm tôi thấy:

gradle ci 
:compileJava 
:processResources UP-TO-DATE 
:classes 
:jar 
:assemble 
:compileTestJava UP-TO-DATE 
:processTestResources UP-TO-DATE 
:testClasses UP-TO-DATE 
:test UP-TO-DATE 
:check UP-TO-DATE 
:clean    // cleaning after the build 
:build 
:ci 

Lưu ý, rằng sạch xảy ra sau khi xây dựng mục tiêu, mà làm mờ nhạt những xây dựng của tôi.

Nếu tôi thay đổi nhiệm vụ của tôi để:

task ci(dependsOn: [ 
    clean, 
    test 
]) 

Sau đó, nó xuất hiện để thực hiện theo đúng thứ tự:

:clean UP-TO-DATE // cleaning before the build 
:compileJava 
:processResources UP-TO-DATE 
:classes 
:compileTestJava UP-TO-DATE 
:processTestResources UP-TO-DATE 
:testClasses UP-TO-DATE 
:test UP-TO-DATE 
:ci UP-TO-DATE 

tôi đã cố gắng sửa chữa các mục tiêu ban đầu bằng cách thêm một build.dependsOn sạch, nhưng điều này dường như không có ảnh hưởng gì.

Mọi trợ giúp đều được đánh giá cao.

Trả lời

38

Dường như tôi đã tình cờ gặp vấn đề đang được tranh luận trong GRADLE-427 trong đó gradle xác định thứ tự tốt nhất để thực hiện các tác vụ. Tôi giải quyết được sự cố của mình bằng cách làm theo lời khuyên trong đó cũng được ghi lại trong số Gradle User Guide - Section 15.5 để thiết lập thứ tự giữa các tác vụ khác nhau. thức ci mục tiêu của tôi do đó xuất hiện như:

task ci(dependsOn: ['clean', 'build', 'uploadArchives']) 
build.mustRunAfter clean 
uploadArchives.mustRunAfter build 

Và tất cả những gì hiện đang làm việc như mong đợi.

+1

Tôi đã thử phương pháp này trong quá khứ, nhưng tôi không thích nó vì nó giới thiệu các phụ thuộc nhân tạo. Tôi đã có vấn đề trong quá khứ nhận được đơn đặt hàng để được chính xác những gì tôi cần.Tôi đã thấy rằng cách tiếp cận "bí danh" được phác thảo ở đâu đó trong chuỗi này hoạt động tốt hơn (và không giới thiệu phụ thuộc nhân tạo) – Lance

2

Tôi không muốn thêm tác vụ trình bao bọc chỉ để đảm bảo đơn đặt hàng.

Trong trường hợp này, giải pháp của tôi là như sau -

run.dependsOn 'clean' compileJava.mustRunAfter 'clean'

Điều này đảm bảo rằng, clean nhiệm vụ thực hiện trước khi thực hiện gradle compileJava. Vì vậy, hiệu quả, bạn sẽ tạo ra một xây dựng mới tất cả các thời gian.

Hy vọng điều này sẽ hữu ích.

8

Phiên bản TLDR: Đây là cách tôi đã thực hiện trong một trong các dự án của mình (không giới thiệu phụ thuộc nhân tạo).

//--- build aliases : define a synonym here if you want a shortcut to run multiple targets 

def buildAliases = [ 
    'all' : ['clean', 'assemble', 'runProvisioner', 'stopTomcat', 'installTomcat', 'deployToTomcat', 'startTomcat'], 
    'rebuild' : ['clean', 'assemble'] 
] 
def expandedTaskList = [] 

gradle.startParameter.taskNames.each { 
    expandedTaskList << (buildAliases[it] ? buildAliases[it] : it) 
} 

gradle.startParameter.taskNames = expandedTaskList.flatten() 

println "\n\n\texpanded task list: ${gradle.startParameter.taskNames }\n\n" 

Đối với nền hơn nữa, xem:

https://caffeineinduced.wordpress.com/2015/01/25/run-a-list-of-gradle-tasks-in-specific-order/

+0

Trong khi liên kết này có thể trả lời câu hỏi, tốt nhất là đưa các phần quan trọng của câu trả lời vào đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở thành không hợp lệ nếu trang được liên kết thay đổi. – ZygD

+0

Xong. Nếu ai đó dành thời gian để đến đây và giải thích mọi thứ (và điều chỉnh câu trả lời dựa trên phản hồi của bạn), bạn không nên downvote nó. Điều này khiến tôi không muốn đăng bài ở đây. – Lance

0

Sử dụng một vài tiện ích Groovy/Gradle giải pháp có thể được cải thiện hơn nữa với những điều sau đây:

def taskNames = [...] // list of task names 

task('lastTask', dependsOn: taskNames) 

taskNames.inject(null) { acc, val -> 
    if (acc != null) tasks[val].mustRunAfter acc 
    tasks[val] 
} 

Bằng cách này, bạn có thể có một nơi với danh sách nhiệm vụ.