创建在gradle中的所有其他任务之前运行的任务

时间:2017-07-19 07:26:10

标签: gradle task init

我需要创建一个初始化任务,当我执行它时,它将在所有其他任务之前运行。

task A {
    println "Task A"
}

task initializer {
   println "initialized"
}

如果我执行gradle -q A,输出将为:

>initialized

>Task A

现在,如果我要添加:

task B {
    println "Task B"
}

执行gradle -q B,我得到:

>initialized

>Task B

因此,执行哪个任务并不重要,它总是先“初始化”。

3 个答案:

答案 0 :(得分:8)

您可以将每个任务的名称都设置为“初始化程序”'取决于'初始化程序'任务。例如:

task initializer {
   doLast { println "initializer" }
}

task task1() {
   doLast { println "task1" }
}

// make every other task depend on 'initializer'
// matching() and all() are "live" so any tasks declared after this line will also depend on 'initializer'
tasks.matching { it.name != 'initializer' }.all { Task task ->
    task.dependsOn initializer
}

task task2() {
   doLast { println "task2" }
}

或者您可以添加BuildListener(或使用其中一种便捷方法,例如:Gradle.buildStarted(...)

答案 1 :(得分:0)

好像你的目标是执行阶段,你想要一个任务在每个任务中占优势,或者只是在执行阶段作为第一个任务运行?

如果您希望任务在每个项目之前始终在每个项目中执行,那么您可以在主要build.gradle中添加一个闭包:

allprojects {
  afterEvaluate {
    for(def task in it.tasks)
      if(task != rootProject.tasks.YourTask)
      task.dependsOn rootProject.tasks.YourTask
  }
}

tasks.matching {it != YourTask}.all {it.dependsOn YourTask}

您还可以使用Task Execution Graph来定义生命周期。根据您的需求和项目结构,实现目标的方法很少。

答案 2 :(得分:0)

先前建议的dependsOn解决方案可以很好地工作,但是我不喜欢它会改变和使任务依赖性变得混乱。我想到的第一个解决方案是使用Gradle Initialization Scripts。他们真的很棒。但是,用法有些单调乏味:目前尚无默认的项目本地Gradle初始化脚本。您必须在命令行上明确指定脚本,或将其放在USER_HOME / GRADLE_HOME中。

因此,可以用来运行某些初始化(如init任务/脚本)的另一种解决方案(已由@ lance-java进行了简要介绍)是“ build listeners”。根据初始化代码应该运行的早/晚时间,我使用以下两种方法之一:

gradle.afterProject {
    println '=== initialized in afterProject'
}

gradle.taskGraph.whenReady {
    println '=== initialized in taskGraph.whenReady'
}

这里是Gradle interfaceBuildListener的文档。

请注意,某些事件发生得很早,因此您可能无法使用它们,例如beforeProjectbuildStarted(解释herethere)。