2013-07-12 50 views
24

我正在做一個需要調用一些其他任務的Gradle任務。Gradle任務按順序調用其他任務

這是我有:

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

奇怪的是輸出我看到:

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 

注意,該清潔構建目標,其中打掉我生成後發生。

如果我改變我的任務:

task ci(dependsOn: [ 
    clean, 
    test 
]) 

然後,它會出現在正確的順序來執行:

: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 

我試圖通過添加build.dependsOn乾淨固定原定目標,但這似乎沒有影響。

任何幫助表示讚賞。

回答

38

看來我已經在GRADLE-427中偶然發現了正在討論的問題,其中gradle決定了執行任務的最佳順序。 我通過遵循Gradle User Guide - Section 15.5中記錄的建議來解決我的問題,以建立不同任務之間的順序。因此,出現在我的最後CI目標爲:

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

而現在一切都按預期工作。

+1

我已經嘗試過這種方法,但我不喜歡它,因爲它引入了人爲依賴。過去,我遇到了問題,使訂單成爲我所需要的。我發現這個線程中別處概述的「別名」方法效果更好(並且不引入人爲依賴) – Lance

2

我不想添加包裝任務只是爲了確保訂單。

在這種情況下,我的解決方案如下 -

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

這可以確保,gradle這個執行compileJavaclean執行任務。如此有效地,您將始終創建一個全新的版本。

希望這會有所幫助。

8

TLDR版本:以下是我在其中一個項目中做過的事情(沒有引入人工依賴關係)。

//--- 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" 

對於進一步的背景,請參閱:

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

+0

雖然此鏈接可能回答問題,但最好在此處包含答案的基本部分並提供鏈接以供參考。如果鏈接頁面更改,則僅鏈接答案可能會失效。 – ZygD

+0

完成。如果有人花時間來到這裏並解釋事情(並根據您的反饋調整答案),您不應該低估它。這讓我不想在這裏發帖。 – Lance

0

使用一些Groovy中/搖籃善良的解決方案可以與以下得到進一步改善:

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

task('lastTask', dependsOn: taskNames) 

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

這樣,你就可以有一個地方有一個任務列表。