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

bru*_*den 22 gradle

当任务没有产生任何输出时,如何正确地将Gradle任务标记为"最新"?如果上次运行成功并且输入自那时起没有改变,则任务应保持"最新".Gradle指南在第15.9.2节之前说明,如下:

"A task with no defined outputs will never be considered up-to-date."
Run Code Online (Sandbox Code Playgroud)

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

big*_*guy 15

只考虑不同的场景......

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

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

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

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

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

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

首先,我会尝试:

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

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

  • 仅具有inuts的任务的典型示例是验证任务.我有一个例子,我验证开发人员没有在构建中传递的文件中输入特定的URL,用户名或密码.如果找到,我们将失败,但有例外.但是我会添加一个"报告"作为输出,感谢您的建议! (9认同)

小智 5

您可以重写任务upToDateWhen方法。

task createDist(type: Zip) {
  outputs.upToDateWhen {
    return true
  }
}
Run Code Online (Sandbox Code Playgroud)

所以 true 总是最新的, false 总是过时的。您可以定义任何类型的自定义逻辑来确定它是否是最新的。

  • 我想要的逻辑是,如果上次没有错误并且输入从那时起没有改变,那么它就是最新的 - 我不相信我可以轻松地为此编写一个 upToDateWhen 函数。Gradle 需要知道最后一次成功运行的时间,因此我认为这只能通过临时文件来解决。我认为 Gradle 对于这种情况会有更好的答案。 (2认同)