使用Gradle,我如何打印每个任务执行多长时间?

jas*_*645 2 gradle

现在,对于频繁运行的gradle目标之一,输出如下所示:

:DataPlanner:清洁
:普通:干净
:服务器:干净
:模拟器:干净
:util:干净
:util:compileJava
:util:processResources最新
:util:classes
:util:compileTestJava
:util:processTestResources
:util:testClasses
:util:test
:util:jar
:common:compileJava
:common:processResources最新
:common:classes
:common:compileTestJava
:common:processTestResources

如何使它看起来像这样?

:DataPlanner:清洁
花了2秒
:普通:干净
花了2秒
:服务器:干净
用了3秒
:模拟器:干净
用了4秒
:util:干净
用了1秒
...

如果不可能让每个任务都在完成时打印其持续时间,则打印时间戳是一种可以接受的选择。

有任何想法吗?

修改对我不起作用的建议解决方案之一,该解决方案做到了:

gradle.taskGraph.beforeTask { Task task ->
task.ext.setProperty("startTime", new java.util.Date())
}

gradle.taskGraph.afterTask { Task task, TaskState state ->
    int secs = ( new java.util.Date().getTime() - task.ext.startTime.getTime() ) / 1000
    int mins = secs / 60

    if ( 4 < secs ) {
        int sec = secs - mins * 60
        println " -> took " + mins + ( ( 1 == mins ) ? " min " : " mins " ) + sec + ( ( 1 == sec ) ? " sec" : " secs" )
    }
}
Run Code Online (Sandbox Code Playgroud)

Amn*_*hot 5

我不知道你是怎么得到这个特定输出的。但是,您可以使用--profile命令行标志来获取有关您的构建的报告。然后您将在build / reports / profile下获得一个html报表,在Gradle 2.3中它看起来像:

在此处输入图片说明

您可以阅读摇篮文档中更多关于它在这里

如果您坚持要获得指定的特定输出,则可以尝试使用beforeTaskand afterTasktaskGraph挂钩来测量时间并打印出来。请注意,如果gradle将在并行模式下执行,则需要谨慎。


wha*_*erg 5

您可以添加执行前和执行后挂钩来执行此操作。在任务执行之前,将当前时间添加为任务的一个属性,然后在执行之后,您可以将当前时间与保存的时间进行比较。

import java.time.*
gradle.taskGraph.beforeTask { Task task ->
    task.ext.setProperty("startTime", Instant.now())
}

gradle.taskGraph.afterTask { Task task, TaskState state ->
    println task.name + " took " + Duration.between(task.ext.startTime, Instant.now()).toSeconds() + " seconds"
}
Run Code Online (Sandbox Code Playgroud)

结果是这样的输出:

$gradle clean
:clean
clean took 0.043000000 seconds
Run Code Online (Sandbox Code Playgroud)

  • `beforeTask` 和 `afterTask` 已弃用。最新的替代方案是什么? (2认同)