gradle中的UP-TO-DATE是什么意思?

24

我最近在一个项目中开始使用gradle,并且正在运行标准版。

gradle clean init build

我注意到在许多正在运行的任务中,控制台旁边会显示这个 UP-TO-DATE 消息,说明当前任务正在运行。例如:

:foo:bar:test UP-TO-DATE

我很好奇这条消息的含义是什么。找不到相关的文档。


1
问题已经得到回答,但这里提供一个可能有用的技巧。如果你想让某个任务一直运行(例如从网络端点下载更新数据),可以添加 outputs.upToDateWhen { false }。代替 false 的是你可以编写任何自定义代码来判断输出是否为最新。 - Gene Pavlovsky
1
问题已经回答了,但是这里有一个可能会有用的技巧。如果你想让某个任务一直运行(例如从网络端点下载更新的数据),可以添加 outputs.upToDateWhen { false }。你可以使用任何自定义代码来确定输出是否是最新的,而不仅仅是 false - Gene Pavlovsky
4个回答

26

Gradle所做的一切都是任务。大多数任务都有声明的输入和输出。Gradle将通过检查输入和输出来确定任务是否为最新状态。

例如,您的compile任务的输入是源代码。如果源代码自上次编译以来没有更改,则它将检查输出以确保您没有删除编译器生成的类文件。如果输入和输出未更改,则认为任务是“最新状态”,并且不执行该任务。这可以节省大量时间,特别是在大型构建中。


如果一个任务的工作是测试Java类(就像我们从Java插件中得到的测试任务),假设您有一些失败的测试,如果您运行相同的任务两次,如果测试源代码没有更改,它是否根本不会运行? - Ankit Dhingra
另外,一旦我进行清理操作,它不会强制所有任务重新启动吗? - Ankit Dhingra
@AnkitDhingra,一个测试任务可能会像你在第一条评论中所说的那样表现,但这不是默认测试任务的行为。至于“clean”,运行“clean”只会删除构建目录,因此如果任务具有构建目录中的输入或输出,则“clean”将仅强制任务重新启动。 - CaTalyst.X

12

顺便提一句:如果你真的想绕过这个构建优化,你可以使用--rerun-tasks命令行选项来强制执行每个任务。 参见gradle命令行选项文档


6
Gradle是一种增量构建系统。这意味着它会在实际执行任务之前检查任务是否真的需要执行,以提高速度。
例如,如果您在先前的构建中已经编译了源文件,并且没有修改任何源文件(也没有修改编译任务的任何其他输入),那么Gradle不会重新编译所有源文件,因为它知道这将导致与已经存在于构建文件夹中的输出完全相同。因此,编译可以安全地跳过,从而加快构建速度。
更多信息请参阅文档

-3

我遇到了类似的问题,尝试了所有的选项,但以下方法对我有效:

 gradle  -Dorg.gradle.daemon=false <your tasks>

1
这个回答似乎与问题无关,因为它并没有询问任何问题,只是一个解释。 - Jolta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接