Como criar uma tarefa gradle que sempre é executada?
-
21-12-2019 - |
Pergunta
Provavelmente estou negligenciando algo bastante importante/óbvio, mas como posso criar uma tarefa que sempre será executada para cada tarefa/destino?
Posso fazer algo como:
task someTask << {
println "I sometimes run"
}
println "I always run"
Mas seria muito mais desejável ter a parte sempre ativa em uma tarefa.
O mais próximo que cheguei é:
task someTask << {
println "I sometimes run"
}
println "I always run"
void helloThing() {
println "I always run too. Hello?"
}
helloThing()
Portanto, usar um método é uma solução 'ok', mas eu esperava que houvesse uma maneira de designar/reutilizar especificamente uma tarefa.
Espero que alguém tenha uma maneira de fazer isso.:)
Solução
Supondo que o objetivo seja imprimir informações do sistema, você pode sempre imprimir as informações na fase de configuração (fora de uma declaração de tarefa) e ter uma tarefa fictícia systemStatus
isso não faz nada (porque a informação é impressa de qualquer maneira).Ou você pode implementá-lo como uma tarefa regular e garantir que a tarefa sempre seja executada adicionando ":systemStatus"
como o primeiro item gradle.startParameter.taskNames
(uma lista de strings), que simula alguém sempre digitando gradle :systemStatus ...
.Ou você pode aproveitar um gancho como gradle.projectsLoaded { ... }
para imprimir as informações lá.
Outras dicas
Isso anexa um fechamento a todas as tarefas em todos os projetos da compilação fornecida:
def someClosure = { task ->
println "task executed: $task"
}
allprojects {
afterEvaluate {
for(def task in it.tasks)
task << someClosure
}
}
Se você precisar que a função/fechamento seja chamada apenas uma vez por compilação, antes todas as tarefas de todos os projetos, use isto:
task('MyTask') << {
println 'Pre-build hook!'
}
allprojects {
afterEvaluate {
for(def task in it.tasks)
if(task != rootProject.tasks.MyTask)
task.dependsOn rootProject.tasks.MyTask
}
}
Se você precisar que a função/fechamento seja chamada apenas uma vez por compilação, depois todas as tarefas de todos os projetos, use isto:
task('MyTask') << {
println 'Post-build hook!'
}
allprojects {
afterEvaluate {
for(def task in it.tasks)
if(task != rootProject.tasks.MyTask)
task.finalizedBy rootProject.tasks.MyTask
}
}
O que há de errado em invocá-lo diretamente da raiz build.gradle
?
task init << {
println "I always run"
}
tasks.init.execute()