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

124

有没有一种方法可以强制运行 Gradle 任务,或者将 所有 任务重置为未 UP-TO-DATE 状态?

5个回答

157

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

在较新版本的Gradle中,请使用--rerun-tasks选项。


98

如果你想让一个任务始终运行,你可以在任务内设置outputs属性。

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

14
这对我没有任何帮助。我将它添加到任务中,然后显示“UP-TO-DATE”。有趣的是,这是一个Zip任务,我却删除了目标存档文件。 - maaartinus
5
对于这种用法,它非常棒:tasks.whenTaskAdded { theTask -> if (theTask.name.startsWith("dex")) { theTask.outputs.upToDateWhen { false } theTask.doLast { task ->... }}} - Martin L.
当任务无法运行时的更新答案。 - cmcginty
请注意,现在启用gradle构建缓存后,这不会导致任务再次运行,而是仅从缓存中恢复其输出。 - eekboom

27

你可以使用cleanTaskname

假设你有

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

如果你想强制重新运行某个任务(比如sometask2),你可以这样做:

someproject:cleanSometask2

在运行任务之前,请确保运行所有任务。

显然,在gradle中,每个理解UP-TO-DATE的任务也都懂得如何清理自己。


1
'gradle clean' 将清理您所在项目的所有内容。它基本上会删除默认情况下为 '/build' 的主输出文件夹。这是您要找的吗? - c_maker
6
不行,如果对于某个任务没有输出文件被捕获,那么它不会重新设置为最新状态。也就是说,如果我的构建的某些部分出现错误但整体上成功了,那么捕获的状态就是错误的,我需要清除它。 - Stefan Kendall
1
通常,删除$buildDir中的所有内容的“clean”任务在构建脚本中是可用的,因为它由基础插件引入。 - Rene Groeschke

6

我曾遇到过一个棘手的问题,在任务中设置 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 }
    }
  }
}

-1

你可以运行:

./gradlew clean

这将强制Gradle重新构建。


@toolforger 是的,看起来他们把它删除了。所以你需要运行 ./gradlew clean - acmpo6ou

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接