【问题标题】:Why run 'gradle clean build' instead of 'gradle build'?为什么运行“gradle clean build”而不是“gradle build”?
【发布时间】:2015-05-15 17:30:23
【问题描述】:

为什么我要运行 gradle clean build 而不是 gradle build

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

【问题讨论】:

  • 为了确保你得到的错误不是 gradle 错误的索引。或者,如果您添加了更改每个依赖项的新库。
  • "gradel clean build" 有助于删除上次构建时生成的所有依赖项,并从服务器获取新的依赖项并构建您的项目。谢谢
  • @Naitik,这不是真的。
  • 那么,如果我只是更改代码并想要一个新版本,那么“gradle build”就足够了吗?只有当我更改依赖项时,我才应该运行“gradle clean build”?
  • 我认为随着增量构建,这正在成为一个更有趣的问题。 Bazel“由于 Bazel 不需要清理构建以确保正确性,因此不应将 CI 系统配置为在开始构建/测试运行之前进行清理。”。我想知道 Gradle 是否也越来越接近这个目标。

标签: gradle build-system


【解决方案1】:

clean taskjava plugin 定义,它只是删除了 buildDir 文件夹,从而清除了所有内容,包括以前构建中不再相关的剩余部分。不这样做可能会导致不干净的构建,由于先前构建产生的构建工件可能会被破坏。

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

【讨论】:

  • 感谢您的回答。我知道 clean 的作用,但我不知道它何时有用的具体情况。你能提供这样一个例子,以便更好地理解吗?谢谢。
  • 当然。假设您的构建包含多个失败的测试,并且您认为这些测试已过时,因此需要删除。如果不清理测试结果(使用 cleanTest 任务)或完全构建(通过运行 clean 任务),您将陷入失败的测试结果,这将导致构建失败。类似的副作用也可能发生在从源中删除但保留在未清理的构建文件夹中的资源/类。
  • 有道理。您能否编辑您的答案以包含此示例,以便我将其标记为正确?
  • 我想如果你删除了测试类,这会使最新的测试检查失败,这将导致再次运行测试。
  • 基本上:在完美的世界中clean 永远不需要,但是Gradle 无法(可靠地)检测到一些更改(主要是删除)。在这些情况下,clean 是一个简单的逃生舱口。
【解决方案2】:

它会删除构建目录。 (构建包含 gradle 操作的输出)

【讨论】:

    【解决方案3】:

    您不需要运行clean 任务。 Gradle 将跟踪任务依赖关系并为您清理适当的部分。 这是我创建的example Gradle project,以表明接受的答案不正确。

    如果自定义任务不能很好地跟踪它们的依赖关系(它们存在错误),那么clean 是一种解决方法。

    【讨论】:

      【解决方案4】:

      其他构建工具(如 buck)会检测到某些测试已被删除,并且不会在不需要运行干净目标的情况下运行它们。我认为这是 gradle 的陷阱。

      【讨论】:

      • 这主要是不准确的,Gradle 有输入和输出跟踪,几乎所有的任务都可以处理这种情况。
      • Gradle 仅允许对任务及其输入/输出进行更深入的控制。然而,关于任务何时是最新的以及何时执行的假设很容易 - 这有助于将 Gradle 视为某种黑魔法。
      猜你喜欢
      • 2019-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多