我正在学习Gradle并尝试了解输入和输出文件如何确定任务是否是最新的。
即使构建文件没有变化,此任务也永远不会是最新的。
task printFoo() {
inputs.file(getBuildFile())
doLast {
println 'foo'
}
}
即使构建文件发生更改,此任务也始终是最新的。
task printFoo() {
outputs.file(getBuildFile())
doLast {
println 'foo'
}
}
我原本希望这两个例子只在构建文件发生变化时将任务视为过时,否则就是最新的。我错过了什么?
答案 0 :(得分:6)
Gradle需要输入和输出的时间戳才能确定任务结果是否已过期。
在第一种情况下,您没有任何输出时间戳,因为您没有任何输出。 Gradle无法确定您的输出是否是最新的,因为它不知道它们。所以它认为你的输出总是过时的。从文档:"没有定义输出的任务永远不会被认为是最新的。" (https://docs.gradle.org/current/userguide/more_about_tasks.html#sec:up_to_date_checks)
在第二种情况下,Gradle应该按预期执行:在构建文件更改时考虑任务输出过期。从文档:"如果那些输出自上一次构建以来没有改变,那么只定义了输出的任务将被认为是最新的。"。这可能是一个错误,但我认为这是由于您使用构建文件作为输出。你有没有尝试过另一个文件?