为什么要运行“渐进式构建”而不是“渐进式构建”?


70

为什么我会跑gradle clean build,而不是gradle build

据我了解,Gradle可以检测源更改并在需要时更新最终工件。那我为什么还需要clean


2
为了确保您不会从gradle错误索引中得到错误。或者,如果您添加了新的库,这些库会更改每个依赖项。
Tschallacka 2015年

“ gradel clean build”有助于删除上次构建时生成的所有依赖关系,并从服务器获取新的依赖关系并构建您的项目。感谢
Naitik

3
@Naitik,那不是真的。
蛋白石

因此,如果我只是更改代码并想要一个新版本,那么“渐变版本”就足够了吗?而且,仅当我更改依赖项时,我才应该运行“ gradle clean build”?
marius bardan 2015年

1
我认为随着增量构建,这已经成为一个更有趣的问题。Bazel说:“由于Bazel不需要清理构建即可确保正确性,因此不应将CI系统配置为在开始构建/测试运行之前进行清理。” 。我想知道Gradle是否也越来越接近这个目标。
mkobit

Answers:


87

清洁任务由定义Java插件,它简单地删除文件夹buildDir,从而清洁的一切,包括从以前的版本剩菜其不再相关。不这样做可能导致不干净的构建,该构建可能由于先前构建产生的构建工件而被破坏。

作为示例,假设您的构建包含多个失败的测试,并且您确定这些测试已过时,因此需要将其删除。如果不清除测试结果(使用cleanTest任务)或不完全构建(通过运行clean任务),您将陷于失败的测试结果中,这将导致构建失败。从源中删除但仍未清理的build文件夹中的资源/类也可能发生类似的副作用。


谢谢回答。我知道清洁的作用是什么,但我不知道何时使用它的特定情况。您能否提供这样的例子,以便更好地理解?谢谢。
marius bardan

当然。假设您的构建中包含多个失败的测试,并且您认为这些测试已过时,因此需要将其删除。如果不清除测试结果(使用cleanTest任务)或完全不构建(通过运行clean任务),您将陷于失败的测试结果中,这将导致构建失败。从源中删除但仍未清理的build文件夹中的资源/类也可能发生类似的副作用。
Amnon Shochot 2015年

说得通。您可以编辑答案以包括此示例,以便我将其标记为正确吗?
marius bardan 2015年

我以为,如果删除测试类,则会导致最新的测试检查失败,这将导致无论如何都要再次运行测试。
Trejkaz

基本上:在一个完美的世界中clean永远都没有必要,但是Gradle无法(可靠地)检测到某些变化(主要是清除)。在那些情况下,clean是容易逃生的舱口。
约阿希姆·绍尔


0

诸如buck之类的其他构建工具将检测到某些测试已删除,并且无需运行干净目标就无法运行它们。我认为这是重大的陷阱。


2
这主要是不准确的,Gradle具有输入和输出跟踪,几乎所有任务都可以处理这种情况。
mkobit

Gradle仅允许对任务及其输入/输出进行更深入的控制。但是,可以很容易地就何时执行任务以及何时执行任务进行假设-这有助于使Gradle理解为某种黑魔法。
科尼斯堡

0

您不需要运行clean任务。Gradle将跟踪任务依赖性并为您清理适当的零件。这是我创建的一个示例Gradle项目,目的是表明接受的答案不正确。

如果自定义任务不能很好地跟踪其依赖关系(它们已被bug),那么这clean是一种解决方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.