我有一个多项目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
的前面)
答案 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)
您需要完成assembleDebug
和assembleRelease
的定稿(或者可以将它们称为):
task finalizeBuild {
doLast {
println(":finalizeBuild > doLast")
}
}
tasks.whenTaskAdded { task ->
if (task.name == 'assembleDebug' || task.name == 'assembleRelease') {
task.finalizedBy finalizeBuild
}
}