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

使用Gradle,如何打印每个任务执行所需的时间?,gradle,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 :

现在,对于经常运行的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
$gradle clean
:clean
clean took 0.043000000 seconds
:DataPlanner:clean :普通:清洁 :服务器:干净 :模拟器:清洁 :util:clean :util:compileJava :util:processResources最新 :util:classes :util:compileTestJava :util:processTestResources :util:testClasses :util:test :util:jar :common:compileJava :common:processResources最新 :普通:班级 :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 ... :DataPlanner:clean 花了2秒 :普通:清洁 花了2秒钟 :服务器:干净 花了3秒钟 :模拟器:清洁 花了4秒钟 :util:clean 花了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" )
    }
}
gradle.taskGraph.beforeTask{Task任务->
task.ext.setProperty(“startTime”,new java.util.Date())
}
gradle.taskGraph.posterTask{任务任务,任务状态->
int secs=(new java.util.Date().getTime()-task.ext.startTime.getTime())/1000
整数分钟=秒/60
如果(4<秒){
整数秒=秒-分钟*60
println“->取“+mins+((1==分钟);“min”:“min”)+sec+((1==秒);“sec”:“secs”)
}
}

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

您可以在Gradle文档中了解更多信息


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

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

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"
}
结果如下所示:

: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
$gradle clean
:clean
clean took 0.043000000 seconds

上面这些对我来说不起作用,但我发现只要稍加修改,我就可以让它工作:gradle.taskGraph.beforeTask{Task Task->Task.ext.setProperty(“startTime”,new java.util.Date())}gradle.taskGraph.afterTask{Task Task,TaskState->int secs=(new java.util.Date().getTime()-Task.ext.startTime())/1000 int-mins=secs/60如果(4花费了“+mins+((1==mins)?“min”:“min”)+sec+((1==sec)?“sec”:“secs”)}@jasons2645很抱歉!我的版本使用新的Java8时间库。我应该提到这一点。