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

在Gradle中,如何在所有任务完成后输出时间戳?,gradle,Gradle,我有一个多项目Gradle项目,在根项目中,我有以下内容: task timeStamp { doLast { Date now = new Date() println "All completed @ $now" } } allprojects { afterEvaluate { it.getTasks().each { println "finalize set for \"$it.name

我有一个多项目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
时的输出中,时间戳任务运行,但它在其他一些任务之前运行


如何在所有其他输出之后打印此时间戳?(如果可能的话,我希望它直接位于输出中的
构建成功
之前)

您需要完成
assembleDebug
assembleerelease
(或者以任何方式调用它们):


您需要完成
assembleDebug
assembleRelease
(或以任何方式调用它们):


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

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

    }
}
这样,您将向由Gradle计算的任务执行图确定的最后一个要执行的任务添加一个操作

您也可以使用buildFinished钩子,但回调将在#消息中的
构建成功后执行

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 assembly**、…),都将执行此回调。

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

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

    }
}
这样,您将向由Gradle计算的任务执行图确定的最后一个要执行的任务添加一个操作

您也可以使用buildFinished钩子,但回调将在#
消息中的
构建成功后执行

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 Assembly**,…)

我尝试用您的代码替换我的代码,但finalizebuild任务从未执行过。@b而且这些任务可能有不同的名称,
graph.getAllTasks().last()
是相当通用的-由于问题没有任何名称,我只能提供一个通常有效的示例-当任务名称匹配时(一个任务甚至不能由/dependsOn最终确定输出的每个任务,只有大多数任务);例如:我尝试用您的代码替换我的代码,但finalizebuild任务从未执行过。@b如果任务可能有不同的名称,
graph.getAllTasks().last()
是相当通用的,因为问题没有任何名称,所以我只能提供一个示例,通常有效,而任务的名称是匹配的(每个输出的都不能由/dependsOn完成,只能是其中的大多数);例如:我验证了'gradle.buildFinished'解决方案,即使命令失败,也有办法调用它吗?我想在最后打印一些额外的内容,即使构建失败。我验证了'gradle.buildFinished'解决方案,即使命令失败,也有办法调用它吗?我想在最后打印一些额外的内容,即使在bu失败时ild失败了。