我需要创建一个初始化任务,当我执行它时,它将在所有其他任务之前运行。
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
因此,执行哪个任务并不重要,它总是先“初始化”。
答案 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 interface和BuildListener的文档。
请注意,某些事件发生得很早,因此您可能无法使用它们,例如beforeProject
和buildStarted
(解释here和there)。