在 Gradle 中,如何在所有任务完成后输出时间戳?

bni*_*and 1 gradle

我有一个多项目 Gradle 项目,在根项目中,我有以下内容:

task timeStamp {
    doLast {
        Date now = new Date()
        println "All completed @ $now"
    }
}


allprojects {
    afterEvaluate {
        it.getTasks().each {
            println "finalize set for \"$it.name\""
            if (it.name != "timeStamp") {
                it.finalizedBy(':timeStamp')
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在运行时的输出中gradlew build,timeStamp 任务已运行,但它在其他一些任务之前运行。

如何在所有其他输出之后打印此时间戳?(BUILD SUCCESSFUL in ##s如果可能的话,我更喜欢它直接在输出之前)

M.R*_*uti 5

如果您只是想在构建结束时(在执行最后一个任务之后)打印时间戳,您可以按如下方式实现:

gradle.getTaskGraph().whenReady { graph ->
    graph.getAllTasks().last().doLast {
        Date now = new Date()
        println "\n ***** All completed @ $now  ***"

    }
}
Run Code Online (Sandbox Code Playgroud)

这样,您将根据 Gradle 计算的任务执行图确定要执行的最后一个任务的操作。

也可以使用buildFinished钩子,但是回调会在BUILD SUCCESSFUL in ##s 消息之后执行

gradle.buildFinished {
    Date now = new Date()
    println "\n ***** All completed @ $now  ***"
}
Run Code Online (Sandbox Code Playgroud)

命令的结果 ./gradlew classes

> Task :compileJava UP-TO-DATE
> Task :processResources UP-TO-DATE
> Task :classes UP-TO-DATE

BUILD SUCCESSFUL in 0s
2 actionable tasks: 2 up-to-date

 ***** All completed @ Thu Sep 20 21:15:03 CEST 2018  ***
Run Code Online (Sandbox Code Playgroud)

使用这两种解决方案,此回调将在您执行的任何任务中执行(gradle buildgradle clean、 *gradle assemble** 、..)