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

时间:2018-09-20 17:22:49

标签: 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')
            }
        }
    }
}

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

如何在所有其他输出之后打印此时间戳记? (如果可能的话,我希望它在输出中BUILD SUCCESSFUL in ##s的前面)

2 个答案:

答案 0 :(得分:3)

如果您只想在构建结束时(执行最后一个任务之后)打印时间戳,则可以执行以下操作:

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

    }
}

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

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

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

命令./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  ***

使用这两种解决方案,无论您正在执行什么任务( gradle build gradle clean ,* gradle assemble **,..)

答案 1 :(得分:1)

您需要完成assembleDebugassembleRelease的定稿(或者可以将它们称为):

task finalizeBuild {
    doLast {
        println(":finalizeBuild > doLast")
    }
}

tasks.whenTaskAdded { task ->
    if (task.name == 'assembleDebug' || task.name == 'assembleRelease') {
        task.finalizedBy finalizeBuild
    }
}