“最新日期”没有输出时的Gradle任务状态

时间:2015-04-13 06:25:49

标签: gradle

如何正确地将Gradle任务标记为"最新"当任务没有产生任何输出时?任务应该保持最新状态"如果最后一次运行成功,那么投入从那时起就没有改变。 Gradle指南在第15.9.2部分之前说明了以下内容:

"A task with no defined outputs will never be considered up-to-date."

在这种情况下,如何将任务标记为最新?似乎Gradle需要知道上次成功运行的时间,然后将其与输入的最后修改时间进行比较。作为一种解决方法,脚本可以创建/触摸空文件以将任务标记为完成?还有其他建议的解决方法吗?

3 个答案:

答案 0 :(得分:14)

只是想一想不同的情景......

  • 没有任何输入或输出的任务。这些一直在运行。这可能只是包装现有的"做某事"可执行文件。

  • 输入输出的任务。当输入或输出发生变化时,它们会运行。这可能是一个编译器。

  • 只有输出的任务。这些仅在输出已经改变/不存在时运行。这可能是下载内容的东西。 (我认为这些在现实中非常罕见,我会将下载的URL计为输入。)

  • 输入和无输出的任务。我在实践中没有碰到这些。

就像你说的那样,你可以用一个空的输出文件来欺骗最新的检查。内置的Gradle Test任务与您正在描述的内容最相似,并且有一个"报告"作为其输出。我想你可能也会有类似的东西。它可以像捕获任务的stdout / stderr并将其放入文件一样简单。这一切对于一切都过去都没有用,但是当事情失败时它会很有用。

当然,其中任何一个都可以使用自定义upToDateWhen位代码进行补充。例如,您有一个启动网络服务器的任务,它是最新的"当网络服务器已经运行时。我不认为这与你在这里描述的内容非常契合。

首先,我试试:

outputs.files file("${buildDir}/reports/${name}.out")

我认为无论是否在文件中实际放置内容都可以。

答案 1 :(得分:0)

<块引用>

有输入无输出的任务

除非您明确声明输出,否则 Gradle 将决定输出已过期以确保构建安全。

您应该始终清楚地声明输入和输出。

使用 outputs.upToDateWhen { true } 同时声明输出并指示您的输出始终是最新的。

例如(在 Kotlin 中):

task ("dataFileHandler") {
     inputs.file ("data-file.txt")
     outputs.upToDateWhen { true }
     doLast {
         // do something with "data-file.txt"
     }
}

此任务将执行一次(在第一次构建时)并且将保持“UP-TO-DATA”直到“data-file.txt”被更改。

答案 2 :(得分:-1)

您可以覆盖任务upToDateWhen方法。

task createDist(type: Zip) {
  outputs.upToDateWhen {
    return true
  }
}

因此,对于true,它始终是最新的,而且总是过时的。您可以定义任何类型的自定义逻辑,以确定它是否是最新的。