如何创建始终运行的gradle任务?

时间:2014-01-09 19:30:12

标签: gradle build.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()

因此,使用某种方法是一种'好'的解决方案,但我希望有一种方法可以专门指定/重新使用任务。

希望有人有办法做到这一点。 :)

3 个答案:

答案 0 :(得分:10)

假设目标是打印系统信息,您可以随时在配置阶段(在任务声明之外)打印信息,并且具有无效的虚拟任务systemStatus(因为信息已打印)无论如何)。或者您可以将其作为常规任务实现,并确保始终通过添加":systemStatus"作为gradle.startParameter.taskNames的第一项(字符串列表)来运行任务,该项模拟总是键入{{1 }}。或者您可以利用gradle :systemStatus ...之类的钩子在那里打印信息。

答案 1 :(得分:6)

这会为给定构建中的每个项目中的每个任务附加一个闭包:

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
  }
}

答案 2 :(得分:0)

直接从根build.gradle调用它有什么问题?

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

tasks.init.execute()