我正在尝试提高Gradle构建的性能,并发现了Gradle Task Configuration避免API(https://docs.gradle.org/current/userguide/task_configuration_avoidance.html)。除非确实需要,否则它可以推迟任务的创建和配置。这样可以节省大量的启动时间,并且由于我们在构建过程中多次调用Gradle,因此可以节省大量时间。
我们开发了一些供内部使用的插件,我努力改变了定义任务的方式,以避免在不需要时创建任务。我想测试我的更改是否成功并且任务实例化是否延迟。
如何创建任务而不实例化它的简单示例:
class MyTask extends DefaultTask {
}
TaskProvider customTask = tasks.register("customAction", MyTask) {
println "task configured!" // configuration time output
doLast {
println "action 1!" // execution time output
}
}
// configuration like this avoids task instantiation
tasks.named("customAction") {
doLast {
println "action 2!"
}
}
tasks.withType(MyTask).configureEach {
doLast {
println "action 3!"
}
}
执行gradle help
不会打印“已配置任务!”消息,而gradle customAction
发出。
为确保我不会意外触发任务实例化,我想为我们的插件编写测试。但是我找不到确定任务是否实例化的方法。
我了解Build Scans(https://guides.gradle.org/creating-build-scans/),但是我们的公司准则很严格,并且尚待审批,因此我暂时无法使用它。另外,我看不到在测试中使用它的方法。
有没有办法
如果可以在插件的测试代码中使用该解决方案,那将很酷,但是手动评估也将很有价值。
答案 0 :(得分:0)
configureEach
仅在创建任务时调用。您可以编写这样的内容以获取所有已配置任务的列表
def tasks = []
project.allprojects { Project sp ->
sp.tasks.configureEach { Task t ->
tasks,add(t.path)
}
}
project.gradle.buildFinished {
println tasks
}