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

创建在gradle中的所有其他任务之前运行的任务,gradle,task,init,Gradle,Task,Init,我需要创建一个初始化任务,当我执行它时,它将在所有其他任务之前运行 task A { println "Task A" } task initializer { println "initialized" } 如果我执行gradle-q A,输出将是: >initialized >Task A 现在,如果我要补充: task B { println "Task B" } 执行gradle-qb,我得到: >initialized >Tas

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

task A {
    println "Task A"
}

task initializer {
   println "initialized"
}
如果我执行
gradle-q A
,输出将是:

>initialized

>Task A
现在,如果我要补充:

task B {
    println "Task B"
}
执行
gradle-qb
,我得到:

>initialized

>Task B

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

你可以让每个不是“初始值设定者”的任务都依赖于“初始值设定者”任务。例如:

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

或者您可以添加一个(或使用一种方便的方法,例如:)

看起来像是针对执行阶段,您想要一个任务先于每个任务,或者只是作为执行阶段的第一个任务运行

如果您希望任务在每个项目中总是在每个其他任务之前执行,则在对其进行评估后,您可以向主构建添加一个闭包。gradle:

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

tasks.matching{it!=YourTask}。所有{it.dependsOn YourTask}


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

前面建议的带有
dependsOn
的解决方案工作得很好,但我不喜欢它会改变和混淆任务依赖关系。我想到的第一个解决办法是使用。他们真的很酷。但是,这种用法有点乏味:目前没有办法使用默认的项目本地gradleinit脚本。您必须在命令行上显式指定脚本,或者将它们放在
USER\u HOME
/
GRADLE\u HOME

因此,另一个解决方案(已经被@lance java简要提到)是“构建监听器”,它可以用来运行一些初始化,比如init任务/脚本。根据初始化代码运行的早/晚程度,我使用以下两种方法之一:

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

这是和的文件


请注意,有些事件发生得很早,因此您可能无法使用它们,例如,项目开始之前的
构建开始时的
(解释和说明)。

回答您的问题,我希望它始终是执行阶段的第一个任务。@OriWiesel那么为什么你接受了一个答案,用一个初始化任务来预先处理每个任务?也许我遗漏了什么。因为,这正是我需要的。。一个在所有其他任务之前运行的任务。@OriWiesel nvm,我是问你是否需要一个在每个构建中作为第一个任务运行一次的任务,或者一个在构建中预诅咒每个任务的任务。哦。。。很抱歉,因此答案是每个构建一次,并且在所有其他任务之前。
gradle.taskGraph.whenReady {
    println '=== initialized in taskGraph.whenReady'
}