如何确定是否已实例化Gradle任务(配置避免API)

时间:2019-02-07 14:30:08

标签: gradle configuration task instantiation

我正在尝试提高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/),但是我们的公司准则很严格,并且尚待审批,因此我暂时无法使用它。另外,我看不到在测试中使用它的方法。

有没有办法

  • 从Gradle项目中获取已创建/实例化任务的列表?
  • 或者Task或TaskProvider上是否有任何属性显示任务是否已创建/实例化?
  • 还是可以以某种方式离线使用buildscans?

如果可以在插件的测试代码中使用该解决方案,那将很酷,但是手动评估也将很有价值。

1 个答案:

答案 0 :(得分:0)

configureEach仅在创建任务时调用。您可以编写这样的内容以获取所有已配置任务的列表

def tasks = []
project.allprojects { Project sp ->
    sp.tasks.configureEach { Task t ->
        tasks,add(t.path)
    }
}
project.gradle.buildFinished {
    println tasks
}