以编程方式清除UP-TO-DATE属性以进行gradle任务

时间:2017-05-15 15:55:13

标签: gradle groovy build.gradle

我需要以编程方式清除gradle任务依赖项的UP-TO-DATE属性。我正在一个子项目build.gradle文件中工作,该文件处理其他子项目的集成并部署它们。我需要能够仅在一个特定任务正在运行时清除该属性。我想确保在开始部署任务之前,我的三个任务(cleancleanNodeJsnpmInstall始终重新运行。但是,我不想影响其他任务,因为它可以不重新运行这些事情(特别是因为npmInstall需要花费非常少的时间来运行)。

我看了this类似的问题,但那里的答案对我不起作用。使用--rerun-tasks并不足够,因为它依赖于调用者来指定,我需要确保始终为此部署任务重新运行我所需的任务。为这三个任务设置outputs.upToDateWhen { false }并不是我要找的东西,因为这样就要求那些任务总是重新运行,即使是其他不需要它们的任务(除非有& #39;是一种在我的部署任务中指定的方法吗?)。我在build.gradle文件中尝试了第3个建议的答案,方法是在我的clean(即dependsOn中预先dependsOn(cleanClean),但是对于无法识别的任务会产生错误。也许第四个答案可能是工作,但我不确定我理解它。

我确实尝试将我的部署任务设置为依赖于上述三个任务,然后指定每个任务必须在相应的任务之后运行(见下文),但这似乎没有帮助。

task deploy() {
    dependsOn(clean, cleanNodeJs, npmInstall)
    // my deployment logic
}
cleanNodeJs.mustRunAfter(clean)
npmInstall.mustRunAfter(cleanNodeJs)
deploy.mustRunAfter(npmInstall)

希望我尝试做的事情是可能的。提前感谢您的时间和帮助!

1 个答案:

答案 0 :(得分:1)

在构建任务图之后评估upToDateWhen闭包时,您应该可以执行outputs.upToDateWhen { !gradle.taskGraph.hasTask(deploy) }之类的操作。

mustRunAfter不会添加任何依赖项。它只是定义了命令如果所涉及的任务都将被执行,但你仍然可以执行这两个任务而不执行另一个任务。