Gradle 渐变输入和输出

Gradle 渐变输入和输出,gradle,incremental-build,Gradle,Incremental Build,我正在学习Gradle,并试图了解输入和输出文件如何决定任务是否是最新的 即使构建文件没有更改,此任务也永远不会是最新的 task printFoo() { inputs.file(getBuildFile()) doLast { println 'foo' } } 此任务始终是最新的,即使在生成文件更改时也是如此 task printFoo() { outputs.file(ge

我正在学习Gradle,并试图了解输入和输出文件如何决定任务是否是最新的

即使构建文件没有更改,此任务也永远不会是最新的

    task printFoo() {
        inputs.file(getBuildFile())

        doLast {
            println 'foo'
        }
    }
此任务始终是最新的,即使在生成文件更改时也是如此

    task printFoo() {
        outputs.file(getBuildFile())

        doLast {
            println 'foo'
        }
    }

我希望这两个示例只在生成文件更改时才考虑任务的过时,否则更新。我遗漏了什么?

Gradle需要输入和输出的时间戳来确定任务结果是否过期

在第一种情况下,您没有任何输出时间戳,因为您没有任何输出。Gradle无法确定您的输出是否是最新的,因为它不知道它们。因此,它认为您的输出总是过时的。从文档中可以看出:“没有定义输出的任务永远不会被认为是最新的。”()


在第二种情况下,Gradle应该按照您的预期去做:在生成文件更改时考虑任务输出。从文档中可以看出:“如果自上一次构建以来这些输出保持不变,则仅定义了输出的任务将被视为最新的。”。这可能是一个bug,但我认为这是由于您使用构建文件作为输出。您是否用另一个文件进行了测试?

我用几个文件再次进行了测试:当只指定了输出时,状态总是最新的。指定输入和输出时,状态会按预期更改(即使输入和输出是同一文件)。我根据“Gradle需要输入和输出的时间戳”这句话接受了这个答案。我的测试表明这两者都是必需的。听起来像个bug。但是我不知道谁应该更改输出文件以及何时更改,因为只有输出的任务被认为是过时的。您是否应该在该任务的配置阶段触摸/更改输出?我认为语义不清楚。最好始终指定输入和输出以实现可靠的行为。如果指定了输出,但该文件不存在,则该文件也是最新的?否,如果某个任务的某个输出丢失,则该任务不是最新的。您明确声明该任务将生成一个文件/目录,因此当该文件/目录不存在时,该任务不能是最新的。