如何正确地将Gradle任务标记为"最新"当任务没有产生任何输出时?任务应该保持最新状态"如果最后一次运行成功,那么投入从那时起就没有改变。 Gradle指南在第15.9.2部分之前说明了以下内容:
"A task with no defined outputs will never be considered up-to-date."
在这种情况下,如何将任务标记为最新?似乎Gradle需要知道上次成功运行的时间,然后将其与输入的最后修改时间进行比较。作为一种解决方法,脚本可以创建/触摸空文件以将任务标记为完成?还有其他建议的解决方法吗?
答案 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,它始终是最新的,而且总是过时的。您可以定义任何类型的自定义逻辑,以确定它是否是最新的。