groovy 即使upToDateWhen返回true,Gradle任务也会运行

vtwuwzda  于 2023-06-21  发布在  其他
关注(0)|答案(1)|浏览(113)

我正在学习Gradle。我有一个任务,我使用了upToDateWhen方法。它被硬编码为总是返回true。我听说,如果这是真的,该方法被认为是最新的,它不会运行。但是当我执行任务时,它第一次运行,然后从第二次开始停止运行,说它是最新的。我以为它连第一次都跑不了。我错过了什么。请给我点光。

task inputOutputCheckWithMethodCall(group:'Learn-Task-Execution',description:'This task is used to learn how gradle executes tasks by evaluating input and output through method call during execution time'){
    outputs.upToDateWhen {true}

       doFirst{

        println 'Executing task inputOutputCheckWithMethodCall'  

    }
       }
qmelpv7a

qmelpv7a1#

输出是否为最新只是计算任务是否为最新的一部分。参见https://github.com/gradle/gradle/issues/2467#issuecomment-315184626
outputs.upToDateWhen { true }并不意味着“任务是最新的”,它只是意味着输出是针对特定规范的最新的。Gradle仍然会进行自己的最新检查。
另一件可能令人困惑的事情是任务的操作是在哪里定义的。如果操作是在构建脚本中定义的,则构建脚本本身就是任务的输入。因此,对构建脚本的更改将使任务过期。
如果我有一个任务,比如:

task myTask {
    def outputFile = file("output.txt")
    outputs.file outputFile
    doLast {
        outputFile.text = "Done"
    }

    outputs.upToDateWhen { false }
}

每当我运行此命令时,myTask都过时了。如果我将false切换为true,第一次运行它时,任务仍然是过时的(因为buildscript更改了)。当我再次运行它时,它将是最新的(所有输入都是相同的)。你会在信息级日志中看到这个。

Task ':myTask' has additional actions that have changed

相关问题