【问题标题】:Gradle inputs and outputsGradle 输入和输出
【发布时间】:2015-08-24 13:14:43
【问题描述】:

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

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

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

        doLast {
            println 'foo'
        }
    }

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

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

        doLast {
            println 'foo'
        }
    }

我希望这两个示例仅在构建文件更改时才认为任务已过期,否则为最新。我错过了什么?

【问题讨论】:

    标签: gradle incremental-build


    【解决方案1】:

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

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

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

    【讨论】:

    • 我用几个文件再次测试:当只指定输出时,状态总是最新的。当输入和输出都指定时,状态会按预期改变(即使输入和输出是同一个文件)。我已根据以下声明接受了此答案,“Gradle 需要输入和输出的时间戳。”我的测试表明两者都是必需的。
    • 这听起来像一个错误。但是我不知道谁应该更改输出文件以及何时执行此操作,因为只有输出的任务被认为是过时的。您是否应该在该任务的配置阶段触摸/更改输出?我认为语义尚不清楚。最好始终指定可靠行为的输入和输出。
    • 如果指定了输出但文件不存在,它也是最新的吗?
    • 不,如果其中一个输出丢失,则任务不是最新的。您明确声明该任务将生成一个文件/目录,因此当它不存在时,该任务不能是最新的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 2022-08-22
    • 1970-01-01
    • 2022-08-02
    • 2022-01-21
    相关资源
    最近更新 更多