2012-05-11 185 views
14

具有https://github.com/gradle/gradle/blob/master/build.gradle摘錄自定義條件的配置:的搖籃項目

ext { 
    isDevBuild = { 
    gradle.taskGraph.hasTask(developerBuild) 
    } 
} 

task developerBuild { 
    description = 'Builds distributions and runs pre-checkin checks' 
    group = 'build' 
    dependsOn testedDists 
} 

當我用這個方法在我的項目來創建自定義的配置,我發現:

isDevBuild === true 

即它總是正確的,因爲任務'developerBuild'在我的build.gradle項目中,因此在圖中。他們有幾個「不同」的配置(isCIBuild,isCommitBuild,isFinalReleaseBuild,...),所以我想我在這裏出了問題。

有人可以解釋如何使這個配置條件基於一些外部參數?

回答

35

taskGraph.hasTask()告訴任務是否在任務中執行圖,即是否會執行。因爲任務執行圖是在配置階段之後僅創建的,這種方法必須從一個whenReady回調(或在執行階段)稱爲:

gradle.taskGraph.whenReady { graph -> 
    if (graph.hasTask(developerBuild)) { 
     // do conditional configuration 
    } 
} 

爲了使這個的可讀性,我們可以引入新的方法:

def onlyFor(task, config) { 
    gradle.taskGraph.whenReady { graph -> 
     if (graph.hasTask(task)) { 
      project.configure(project, config) 
     } 
    } 
} 

現在我們可以這樣寫:

onlyFor(developerBuild) { ... } 
onlyFor(ciBuild) { ... } 

另外,爲了解決這個問題,簡單的方法是檢查一個特定的任務名稱是否包含在gradle.startParameter.taskNames。但是,這有兩個限制:首先,它比較名稱,這可以在多項目構建中發揮作用。其次,它只能找到直接指定的任務(例如在命令行上),而不是依賴關係。

PS:在您的代碼中,isDevBuild始終成立,因爲根據Groovy的真值,(非空)閉包爲true。 (與isDevBuild()不同,isDevBuild不會調用關閉。)

+0

回到「用Gradle構建和測試」一書的斷言:Groovy的知識不是加號 - 它必須開始使用Gradle。謝謝你的幫助。將在今天晚些時候檢查。 –

+1

我不會說這是必須開始的,但有必要實施像這樣的高級解決方案。 (需要較少Groovy知識的簡單替代方案是根據系統屬性在不同配置之間切換。)然後,大部分代碼可以用Java風格編寫(使用匿名內部類等),或者從字面上用Java編寫將其移入插件。在這種特殊情況下,真正的挑戰是理解Gradle方面:任務圖API,配置與執行階段等。 –

+0

您的解決方案運行良好。非常感謝。對於你在P.S.中的註釋。 :例如,當我使用'ciBuild jar'執行Gradle構建時,我不能直接調用'isDevBuild()'(但我不能在同一時間使用這兩個配置) - 儘管您表明我只能爲了教育目的而調用閉包。 –