2015-10-13 61 views
0

This Android example build file包含片段如何在配置步驟中將Gradle屬性設置爲不同的值?

buildTypes { 
     release { 
      minifyEnabled true 
     } 

但由於搖籃一直執行所有配置在生成腳本語句,也不會因本總是設置minifyEnabled爲真,即使是調試版本?

希望搖籃將讓我在一個任務一個變量設置爲true,而在另一個虛假和配置不同的東西,但我已經能夠做到這一點的唯一方法是通過等待taskGraph.whenReady。這是它的正常工作:

def myBool = false 

task runs { 
    myBool = true 
} 

task doesNotRun { 
    myBool = false 
} 

task whoWins(dependsOn: runs) { 
    doLast { println "myBool is ${myBool}" } 
} 

gradle whoWins 
:runs 
:whoWins 
myBool is false 
+0

你們是不是要設置一個「變量」正在定義和使用,或者是你想設置任務「財產」? –

+0

爲什麼您需要在配置時(與運行時相比)將多個任務設置爲相同的值? –

+0

重要的是,'def myBool = false'與'ext.myBool = false'?該示例工作原理相同。 這似乎很奇怪,如果你想設置'source = someFiles',你可以在配置的時候這樣做,但是如果你想設置'source = debug? someFiles:otherFiles',你必須在運行時或可能在'taskGraph.whenReady'中執行。 – Noumenon

回答

1

的配置步驟是幫助搖籃建設任務的執行圖形(什麼將實際運行),這就是爲什麼在執行所有的配置代碼。您所描述的內容聽起來像是一個循環任務依賴關係,其中任務取決於由任務設置的變量,而該任務依次取決於第一個任務。

Task A -> depends on Task B -> depends on variable from Task A 

您可能正在尋找的是根據執行圖配置任務的能力。請參閱Gradle用戶指南,第6.13節Configure by DAG。使用它可以讓你打破你的循環依賴。

Task A -> depends on Task B -> depends on gradle.taskGraph.whenReady 

或者你也可以創建一個新的任務,任務C,它處理基於任務的圖形設置變量。

def myBool = false 

task runs {} 

task doesNotRun {} 

task whoWins(dependsOn: runs) { 
    doLast { println "myBool is ${myBool}" } 
} 

task taskC << { 
    if (gradle.taskGraph.hasTask(runs)) { 
     myBool = true 
    } else if (gradle.taskGraph.hasTask(doesNotRun)) { 
     myBool = false 
    } 
} 
runs.dependsOn(taskC) 
doesNotRun.dependsOn(taskC) 

結果:

$ gradle whois 
:taskC 
:runs 
:whoWins 
myBool is true 
+0

我從來沒有想過在運行時檢查任務圖,這似乎比taskGraph.whenReady中的一堆代碼更清潔。 我在https://docs.gradle.org/current/userguide/multi_project_builds.html#sub:real_life_examples上看過類似這樣的內容,但沒有想到。 這似乎是Android代碼工作的唯一方法是不檢查'如果minifyEnabled',因爲這將永遠是真實的,但'如果taskGraph.hasTask(釋放){//然後檢查是否minifyEnabled}'。 – Noumenon

相關問題