2014-01-09 61 views
9

我很可能忽略了一些相當核心/顯而易見的事情,但是我怎樣才能創建一個始終爲每個任務/目標執行的任務?如何創建總是運行的gradle任務?

我可以這樣做:

task someTask << { 
    println "I sometimes run" 
} 
println "I always run" 

但它會更理想的是具有在任務中始終處於運行狀態的一部分。

我來最接近的是:

task someTask << { 
    println "I sometimes run" 
} 

println "I always run" 

void helloThing() { 
    println "I always run too. Hello?" 
} 

helloThing() 

因此,使用的方法是「OK」的解決方案,但我希望有會是專門指定/重新使用任務的方式。

希望有人有辦法做到這一點。 :)

+0

如果有N個任務,這個函數應該調用N次,對嗎?如果某些任務從未在給定的構建中執行,該怎麼辦? – akhikhl

+0

或者你想爲每個項目調用一個函數嗎? – akhikhl

+0

每個構建一次。不管哪個任務被調用。 – CasualT

回答

6

假設目標是打印系統信息,你可以要麼只是始終打印在配置階段的信息(任務聲明外),並有僞任務systemStatus,什麼也不做(因爲信息是無論如何印刷)。或者您可以將其作爲常規任務來執行,並確保始終通過將":systemStatus"作爲gradle.startParameter.taskNames(字符串列表)的第一項來運行該任務,該任務模擬總是鍵入gradle :systemStatus ...的某人。或者你可以利用鉤子如gradle.projectsLoaded { ... }來打印那裏的信息。

+0

這是關於動態操作taskNames列表的一個很酷的技巧。 (作爲參考,該作品:「gradle.startParameter.taskNames = [」:someTask「] + gradle.startParameter.taskNames」) – CasualT

+0

不知道如何「鉤」一個任務到另一個任務,比用「執行」,這是其他灰心? –

+1

「dependsOn」或「finalizedBy」。 –

4

這附加一個閉合的每一個任務在每個項目中爲特定的build:

def someClosure = { task -> 
    println "task executed: $task" 
} 

allprojects { 
    afterEvaluate { 
    for(def task in it.tasks) 
     task << someClosure 
    } 
} 

如果您需要的功能/關閉要建立每一次調用,所有的以前所有任務項目,使用此:

task('MyTask') << { 
    println 'Pre-build hook!' 
} 

allprojects { 
    afterEvaluate { 
    for(def task in it.tasks) 
     if(task != rootProject.tasks.MyTask) 
     task.dependsOn rootProject.tasks.MyTask 
    } 
} 

如果您需要的功能/關閉被稱爲構建每一次,所有項目的所有任務,使用:

task('MyTask') << { 
    println 'Post-build hook!' 
} 

allprojects { 
    afterEvaluate { 
    for(def task in it.tasks) 
     if(task != rootProject.tasks.MyTask) 
     task.finalizedBy rootProject.tasks.MyTask 
    } 
} 
+0

嗯...這很方便...比我希望的更詳細一點,但仍然很容易。 – CasualT

+1

我更新了我的答案,關心你說的話 - 「每次構建一次」。 – akhikhl

+1

使用每個構建鉤子比每個項目鉤子更好。第二個片段將在構建結束時運行該任務,而不是開始。 –

0

直接從根build.gradle調用它有什麼問題?

task init << { 
    println "I always run" 
} 

tasks.init.execute() 
相關問題