【发布时间】:2011-11-09 12:46:05
【问题描述】:
有没有一种方法可以强制 gradle 任务再次运行,或将 所有 任务重置为 not UP-TO-DATE 状态?
【问题讨论】:
有没有一种方法可以强制 gradle 任务再次运行,或将 所有 任务重置为 not UP-TO-DATE 状态?
【问题讨论】:
您可以使用cleanTaskname
假设你有
:someproject:sometask1 UP-TO-DATE
:someproject:sometask2 UP-TO-DATE
:someproject:sometask3 UP-TO-DATE
如果你想强制让我们说 sometask2 再次运行,你可以
someproject:cleanSometask2
在你运行运行它的任务之前。
显然,在 gradle 中,每一个理解 UP-TO-DATE 的任务也理解如何自我清理。
【讨论】:
尝试使用-C rebuild 运行您的构建,以重建 Gradle 的缓存。
在较新版本的 Gradle 中,使用 --rerun-tasks
【讨论】:
如果您只想始终运行一个任务,您可以在任务内部设置outputs 属性。
outputs.upToDateWhen { false }
请注意,如果您的任务没有任何已定义的文件输入,Gradle 可能会跳过该任务,即使使用上述代码也是如此。例如,在 Zip 或 Copy 任务中,至少需要在任务定义的配置阶段提供一个文件。
【讨论】:
tasks.whenTaskAdded { theTask -> if (theTask.name.startsWith("dex")) { theTask.outputs.upToDateWhen { false } theTask.doLast { task ->... }}}
我遇到了一个棘手的情况,即在任务中设置 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 }
}
}
}
【讨论】:
你可以运行:
./gradlew cleanBuildCache
./gradlew clean
它将强制 gradle 重建。
【讨论】: