强制Gradle运行任务,即使它是UP-TO-DATE。

72

我遇到一个情况,当Gradle的所有内容都是UP-TO-DATE时,我仍然想让它为我运行任务。显然它没有运行:

gradle test
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE

BUILD SUCCESSFUL

Total time: 0.833 secs

我可以通过运行clean test来强制运行test,但在某些情况下可能被认为是额外负担。是否有一种方法可以强制执行任务,无论Gradle是否认为它是UP-TO-DATE?

2个回答

95
如果您想重新运行所有任务,可以使用 命令行参数 --rerun-tasks。但是这基本上与执行清理操作相同,因为它会重新运行所有任务。
如果您想每次运行单个任务,则可以指定该任务永远不是最新的:
mytask {
    outputs.upToDateWhen { false }
}

如果您想重新运行单个任务并保留所有其他任务,则需要实现一些逻辑:

mytask {

    outputs.upToDateWhen { 
        if (project.hasProperty('rerun')) {
            println "rerun!"
            return false
        } else {
            return true
        }
    }
}

然后,您可以通过使用以下命令来强制重新运行任务:

gradle mytask -Prerun

请注意,这也会重新运行所有依赖于mytask的任务。


14
请注意,如果你的任务没有定义文件输入,即使在执行该任务时,Gradle也可能会跳过该任务! - thSoft
我遇到了一个错误,没有找到可用的build_aoy2on2oal42mml5q3j55j0wu.test()方法。 - john k

14
在Gradle v7.6中,新的--rerun标志可以告诉一个单独的任务忽略最新检查。
./gradlew theTask --rerun

1
@l0b0,我不这么认为。我的理解是--rerun-tasks会执行_所有_任务,而--rerun则只会重新运行单个任务。你看到了不同的情况吗? - Brad Turek

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