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

Cas*_*alT 13 gradle build.gradle

我可能会忽略一些非常核心/明显的东西,但是如何创建一个始终为每个任务/目标执行的任务?

我可以这样做:

task someTask << {
    println "I sometimes run"
}
println "I always run"
Run Code Online (Sandbox Code Playgroud)

但是,在任务中使用始终运行的部分会更加可取.

我最接近的是:

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

println "I always run"

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

helloThing()
Run Code Online (Sandbox Code Playgroud)

因此,使用方法是一个"好"的解决方案,但我希望有一种方法来专门指定/重用任务.

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

Pet*_*ser 10

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


akh*_*khl 7

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

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

allprojects {
  afterEvaluate {
    for(def task in it.tasks)
      task << someClosure
  }
}
Run Code Online (Sandbox Code Playgroud)

如果你需要每个构建只调用一次函数/闭包,所有项目的所有任务之前,使用:

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

allprojects {
  afterEvaluate {
    for(def task in it.tasks)
      if(task != rootProject.tasks.MyTask)
        task.dependsOn rootProject.tasks.MyTask
  }
}
Run Code Online (Sandbox Code Playgroud)

如果你需要每个构建只调用一次函数/闭包,所有项目的所有任务之后,使用:

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

allprojects {
  afterEvaluate {
    for(def task in it.tasks)
      if(task != rootProject.tasks.MyTask)
        task.finalizedBy rootProject.tasks.MyTask
  }
}
Run Code Online (Sandbox Code Playgroud)