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.:)

Foi útil?

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()
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top