12

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

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

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

        doLast {
            println 'foo'
        }
    }

即使构建文件发生更改,此任务也始终是最新的。

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

        doLast {
            println 'foo'
        }
    }

我曾期望这两个示例仅在构建文件更改时才考虑任务过时,否则是最新的。我错过了什么?

4

1 回答 1

11

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

在第一种情况下,您没有任何输出时间戳,因为您没有任何输出。Gradle 无法确定您的输出是否是最新的,因为它不知道它们。所以它认为你的输出总是过时的。从文档中:“没有定义输出的任务永远不会被认为是最新的。” (https://docs.gradle.org/current/userguide/more_about_tasks.html#sec:up_to_date_checks

在第二种情况下,Gradle 应该做你所期望的:当构建文件更改时,考虑任务输出已过期。来自文档:“如果这些输出自上一次构建以来未发生变化,则仅定义输出的任务将被视为最新的。”。这可能是一个错误,但我认为这是由于您使用构建文件作为输出。你试过用另一个文件吗?

于 2015-07-28T19:23:07.393 回答