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

How to determine if a Gradle task was instantiated (Configuration Avoidance API)

我正在尝试提高 Gradle 构建的性能并发现了 Gradle 任务配置回避 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 不会打印 "task configured!" 消息,而 gradle customAction 会。

为了确保我不会意外触发任务实例化,我想为我们的插件编写测试。但是我找不到确定任务是否实例化的方法。

我知道 Build Scans (https://guides.gradle.org/creating-build-scans/),但是我们公司的指导方针很严格,而且正在等待批准,所以我暂时不能使用它。另外,我没有看到在测试中使用它的方法。

有没有办法

如果该解决方案可以用于插件的测试代码,那就太好了,但手动评估也很有价值。

configureEach 仅在创建任务时调用。你可以写这样的东西来获取所有配置任务的列表

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