为什么Gradle Wrapper要承诺VCS?

从Gradle的文档: https //docs.gradle.org/current/dsl/org.gradle.api.tasks.wrapper.Wrapper.html

这个任务生成的脚本将被用于你的版本控制系统。 此任务还会生成一个小的gradle-wrapper.jar引导JAR文件和属性文件,这些文件也应该提交给您的VCS。 脚本委托给这个JAR。

来自: 什么不应该在源代码控制之下?

我认为Generated files不应该在VCS中。

何时需要gradlewgradle/gradle-wrapper.jar

为什么不在build.gradle文件中存储gradle version

因为gradle包装器的整个目的是在没有安装gradle的情况下,甚至不知道它是如何工作的,从哪个版本下载,从VCS复制项目,执行gradlew脚本包含并构build项目,而无需任何额外的步骤。

如果你在build.gradle文件中只有一个gradle版本号,那么你需要一个自述文件来解释每个人必须从安装的URL Y下载gradle版本X,每次增加版本时你都必须这样做。

因为gradle包装的整个要点是可以的,没有安装gradle

JDK也有同样的说法,你也想承诺吗? 你还承诺你所有的依赖库吗?

随着新版本的发布,依赖关系应该不断升级。 获得安全性和其他错误修复。 而且,因为如果你远远落后,那么重新开始日程可能是一项非常耗时的任务。

如果每个新版本的Gradle包装都增加了,并且它被提交,回购将会变得非常大。 使用分布式VCS时,问题是显而易见的,其中克隆将下载所有版本的所有版本。

,甚至不知道它是如何工作的

创build一个构build脚本,下载包装并使用它构build。 每个人都不需要知道脚本是如何工作的,他们需要同意通过执行它来构build项目。

,从哪里下载,哪个版本

 task wrapper(type: Wrapper) { gradleVersion = 'XX' } 

接着

 gradle wrapper 

要下载正确的版本。

,从VCS克隆项目,执行其包含的gradlew脚本,并且无需任何额外的步骤即可构build项目。

通过以上步骤解决。 下载Gradle包装与下载任何其他依赖没有区别。 该脚本可以聪明地检查任何当前的gradle包装,只有在有新版本的情况下才能下载。

如果开发者之前从未使用Gradle,也许不知道该项目是使用Gradle构build的。 那么运行“build.sh”比运行“gradlew build”更明显。

如果你只有一个build.gradle文件中的gradle版本号,那么你需要一个自述文件来解释每个人必须从URL Y下载安装的Gradle版本X,

不,你不需要一个自述文件。 你可以有一个,但我们是开发者,我们应该尽可能自动化。 创build一个脚本更好。

每当版本增加时你都必须这样做。

如果开发者同意正确的过程是:

  1. 克隆回购
  2. 运行构build脚本

那么升级到最新的gradle包装是没有问题的。 如果版本自上次运行后增加,则脚本可以下载新版本。

我想推荐一个简单的方法。

在您的项目的自述文件中,logging需要安装步骤,即:

 gradle wrapper --gradle-version 3.3 

这适用于Gradle 2.4或更高版本。 这创build了一个包装器,而不需要将任务添加到“build.gradle”中。

使用这个选项, 忽略 (不检查)这些文件/文件夹的版本控制:

  • ./gradle
  • gradlew
  • gradlew.bat

关键的好处是,你不必检入下载的文件到源代码pipe理。 安装需要一个额外的步骤。 我认为这是值得的。