重置gradle任务的UP-TO-DATE属性?


106

有什么办法可以强制Gradle任务再次运行,或将所有任务重置为非UP-TO-DATE状态?

Answers:


133

尝试使用-C rebuild重新构建Gradle的缓存运行您的构建。

在较新版本的Gradle中,使用 --rerun-tasks


89

如果只希望单个任务始终运行,则可以outputs在任务内部设置属性。

outputs.upToDateWhen { false }

请注意,如果您的任务没有任何定义的文件输入,即使使用上述代码,Gradle也会跳过该任务。例如,在Zip或Copy任务中,在任务定义的配置阶段需要至少提供一个文件。


14
这对我没有任何帮助。我将其添加到任务中并获得“最新”信息。有趣的是,这是一个ZipTask,我删除了目标存档。
maaartinus

5
对于这样的用法,这是不可思议的:tasks.whenTaskAdded { theTask -> if (theTask.name.startsWith("dex")) { theTask.outputs.upToDateWhen { false } theTask.doLast { task ->... }}}
Martin L.

更新了针对无法执行任务的情况的答案。
cmcginty

请注意,当启用了gradle构建的缓存时,这不会导致任务再次运行,但是其输出只会从缓存中恢复。
斯蒂芬·弗里德里希

25

您可以使用 cleanTaskname

假设您有

:someproject:sometask1 UP-TO-DATE
:someproject:sometask2 UP-TO-DATE
:someproject:sometask3 UP-TO-DATE

而且您想强制让sometask2重新运行,您可以

someproject:cleanSometask2

在运行运行所有任务的任务之前。

显然,每项了解UP-TO-DATE的任务也都了解如何进行自我清洁。


1
“ gradle clean”将清除您所在项目的所有内容。它基本上删除了默认情况下的主输出文件夹“ / build”。这是您要找的东西吗?
c_maker 2011年

6
不。如果将最新捕获为给定任务的任何输出文件,则不会将其重新设置为最新。也就是说,如果我有部分构建中断但整体上成功了,那么捕获的状态是错误的,因此我需要清除它。
Stefan Kendall'9

1
通常,删除$ buildDir中所有内容的“干净”任务在构建脚本中可用,因为它是由基本插件引入的。
Rene Groeschke 2012年

5

我遇到了一个艰难的情况,即outputs.upToDateWhen { false }在任务内部进行设置或添加标志--rerun-tasks无济于事,因为每次运行该任务时都会对其setOnlyIf进行设置false

添加以下内容以build.gradle强制执行myTask

gradle.taskGraph.whenReady { taskGraph ->
  def tasks = taskGraph.getAllTasks()
  tasks.each {
    def taskName = it.getName()
    if(taskName == 'myTask') {
      println("Found $taskName")

      it.setOnlyIf { true }
      it.outputs.upToDateWhen { false }
    }
  }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.