Resetting the UP-TO-DATE property of gradle tasks?

有没有一种方法,我可以强迫一个分级任务再次运行,或重置 所有任务回到非最新状态?

72567 次浏览

你可以使用 cleanTaskname

假设你有

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

如果你想强制执行一些任务,你可以这样做

someproject:cleanSometask2

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

显然,在年级,每一个任务,了解最新的也了解如何清洁自己。

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

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

If you want just a single task to always run, you can set the outputs property inside of the task.

outputs.upToDateWhen { false }

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

我遇到过一个棘手的情况,在任务内部设置 outputs.upToDateWhen { false }或者添加标志 --rerun-tasks都没有帮助,因为每次运行任务的 setOnlyIf都被设置为 false

Adding the following to build.gradle forced the execution of 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 }
}
}
}

你可以跑:

./gradlew clean

它会迫使梯级重建。