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

时间:2015-05-13 21:06:58

标签: gradle

现在,对于其中一个经常运行的gradle目标,输出如下所示:

:DataPlanner:clean
:common:clean
:server:clean
:simulator:clean
:util:clean
:util:compileJava
:util:processResources UP-TO-DATE
:util:classes
:util:compileTestJava
:util:processTestResources
:util:testClasses
:util:test
:util:jar
:common:compileJava
:common:processResources UP-TO-DATE
:common:classes
:common:compileTestJava
:common:processTestResources

如何让它看起来更像这样?

:DataPlanner:clean
took 2secs
:common:clean
took 2 secs
:server:clean
took 3 secs
:simulator:clean
took 4 secs
:util:clean
took 1 sec
...

如果在完成时无法完成每个任务打印其持续时间,则打印时间戳将是可接受的替代方案。

有什么想法吗?

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

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" )
    }
}

2 个答案:

答案 0 :(得分:5)

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

enter image description here

您可以在Gradle文档here中阅读更多相关信息。

如果您坚持获取指定的特定输出,可以尝试使用beforeTaskafterTask taskGraph挂钩来测量时间并将其打印出来。请注意,如果gradle将以并行模式执行,您需要小心谨慎。

答案 1 :(得分:3)

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

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"
}

产生如下输出:

$gradle clean
:clean
clean took 0.043000000 seconds