2014-01-09 2 views
9

Я, вероятно, пропущу что-то довольно ядро ​​/ очевидное, но как я могу создать задачу, которая всегда будет выполняться для каждой задачи/цели?Как создать задачу градиента, которая всегда выполняется?

я могу сделать что-то вроде:

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() 

Таким образом, используя метод является «КАМИ» решением, но я надеялся, что бы способ конкретно обозначить/повторное использование задачи ,

Надеюсь, у кого-то есть способ сделать это. :)

+0

Если есть N задач, эту функцию следует называть N раз, правильно? Что делать, если какие-то задачи НИКОГДА не выполняются в данной сборке? – akhikhl

+0

Или вы хотите, чтобы функция вызывалась для каждого проекта? – akhikhl

+0

После сборки. Независимо от того, какие задачи вызывается. – CasualT

ответ

6

Предполагая, что цель заключается в печати информации о системе, можно либо просто всегда печатать информацию на этапе конфигурации (вне декларации задачи), и имеет фиктивный задачу systemStatus, что не делает ничего (потому что информация печатается в любом случае). Или вы можете реализовать его как обычную задачу и убедиться, что задача всегда запускается, добавив ":systemStatus" в качестве первого элемента gradle.startParameter.taskNames (список строк), который имитирует кого-то, всегда печатающего gradle :systemStatus .... Или вы можете использовать такой крючок, как gradle.projectsLoaded { ... }, чтобы распечатать информацию там.

+0

Это крутой трюк, связанный с динамическим манипулированием списком имен задач. (для справки, это работает: «gradle.startParameter.taskNames = [": someTask "] + gradle.startParameter.taskNames") – CasualT

+0

Любая идея, как «перехватить» задачу другой задачей, кроме как «выполнить», которая обескуражены? –

+1

'dependOn' или' finalizedBy'. –

4

Это придает укупорочное для каждой задачи в каждом проекте, в данной сборке:

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() 
Смежные вопросы