为什么Gradle Wrapper会致力于VCS?


147

从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需要什么?

为什么不将a存储gradle versionbuild.gradle文件中?


1
鉴于以下答案,可能是一个有趣的旁讨论,如果您使用某种形式的持续集成工具,这些文件的实用性。哪一个会检查等级包装器,如果有,请使用它?
lilbyrdie 2015年

Answers:


124

因为gradle包装器的全部要点是能够运行,而无需安装gradle,甚至不知道它是如何工作的,从哪里下载它,哪个版本,从VCS克隆项目,执行gradlew脚本。包含,并且无需任何其他步骤即可构建项目。

如果仅拥有build.gradle文件中的gradle版本号,则需要一个README,向所有人解释必须从URL Y下载gradle版本X并进行安装,并且每次版本增加时都必须这样做。


94
太傻了 VCS上不需要gradle-wrapper.jar。如果需要,Gradle应该能够在安装第一个版本后下载任何版本。该工具链与VCS无关...我知道您的答案是正确的,这是Gradle的设计。但是这种设计是荒谬的。
Marc Plano-Lesay 2013年

26
重点是无需下载gradle 可以下载gradle 。在VCS中拥有50KB大小的文件有什么问题?
JB Nizet 2013年

59
问题在于它不是项目的一部分。这是用于构建项目的工具。您不会将JDK存储在VCS中,对吗?GCC是否也不能用于C应用程序?那么,为什么要存储Gradle零件呢?如果开发人员自己无法阅读和安装Gradle,那将是另一个问题。
Marc Plano-Lesay 2013年

26
问题还在于,在发行2年后,您不记得使用了哪个版本的Gradle来构建软件的v1.0版本,您必须为仍在使用此1.0版本的客户进行修补程序版本,无法升级。gradle包装器解决了以下问题:您从VCS克隆了1.0标签,使用gradlew对其进行了构建,并且使用了两年前用于构建1.0版本的gradle版本。
JB Nizet 2013年

33
我同意需要在项目中的某个地方指示要使用的Gradle版本。但是Gradle是一个外部工具,无法与自述文件或列出的任何东西相提并论。Gradle本身应该能够获取相应的版本,而不必在VCS上存储jar。
Marc Plano-Lesay 2013年

80

因为gradle包装器的整个要点是能够的,而无需安装gradle

JDK也有相同的论点,您也要提交吗?您还提交所有依赖库吗?

随着新版本的发布,依赖关系应不断升级。获得安全性和其他错误修复。而且,因为如果您远远落后于它,那么再次更新可能是非常耗时的任务。

如果gradle包装器在每个新发行版中都递增,并且已提交,则repo将变得非常大。当使用分布式VCS时,该问题很明显,其中克隆将下载所有版本的所有版本。

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

创建一个构建脚本,该脚本下载包装程序并使用它进行构建。每个人都不需要知道脚本的工作方式,他们需要同意通过执行该项目来构建该项目。

,从哪里下载,哪个版本

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

然后

gradle wrapper

要下载正确的版本。

,从VCS克隆项目,执行其中包含的gradlew脚本以及无需任何其他步骤即可构建项目。

通过以上步骤解决。下载gradle包装器与下载任何其他依赖项没有什么不同。该脚本可能很聪明,可检查是否有任何当前的gradle包装器,并仅在有新版本时才下载。

如果开发人员以前从未使用过Gradle,并且可能不知道该项目是使用Gradle构建的。与运行“ gradlew构建”相比,运行“ build.sh”更为明显。

如果您所拥有的只是build.gradle文件中的gradle版本号,则需要一个README,向每个人解释必须从安装的URL Y中下载gradle版本X,

不,您不需要自述文件。您可以拥有一个,但是我们是开发人员,我们应该尽可能地自动化。创建脚本更好。

并且每次版本增加时都必须这样做。

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

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

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


2
“依赖关系应该不断升级。” 是的,朝前看。不,朝后看。要重现旧版本,您需要具有特定版本的依赖项。Gradle使某些类型的项目更快,更容易处理。在需要复制和审核的组织中,这将是一团糟。
lilbyrdie 2015年

3
不太确定您的意思。但是,如果您拥有build.gradle版本控制,并且您拥有版本控制,那么: task wrapper(type: Wrapper) { gradleVersion = 'X.X' } 然后gradle wrapper将下载使用的包装程序,然后可以重现旧版本。
Tomas Bjerre

1
是指您关于依赖项的行,而不是gradle版本。当然,您希望您的库具有所有最新的安全性和错误修复程序,但是当您试图复制旧版本时(例如出于审计或法律目的)不希望这样做。您希望您的库和构建过程能够产生二进制相同的输出(如果可能的话)。与库依赖关系一样,不能保证在构建时会提供特定版本……从现在起2周或从现在起2年。是的,对于某些项目,它与库和SDK相同。
lilbyrdie's 2016年

3
我认为包装纸的存在主要是出于历史原因。最初,每个人都在使用Maven,没有人安装Gradle。要说服同事安装未知的侵入性依赖关系很困难,因此包装程序可以帮助他们进行引导。如今,每个人都已经有了Gradle,并且包装程序变得多余。
富兰克林·于

1
您是否建议gradle wrapper在每个版本上克隆后执行?这基本上使包装器无用,因为它的全部目的是您不必在本地安装Gradle即可构建项目
Xerus

41

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

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

gradle wrapper --gradle-version 3.3

这适用于Gradle 2.4或更高版本。这将创建包装程序,而无需将专用任务添加到“ build.gradle”。

使用此选项,忽略(不检入)这些文件/文件夹以进行版本控制:

  • ./gradle
  • Gradlew
  • gradlew.bat

关键好处是您不必将下载的文件检入到源代码管理中。安装需要花费额外的一步。我认为这是值得的。


15
那你为什么要包装呢?包装器的整体思想是,您可以在不影响系统的情况下构建项目。
edio '17

4
不错的解决方案。git中没有二进制文件,仍然可以使用gradlew。@edio,您将需要它来下载和使用特定版本的gradle。
基里尔'18

3

什么是“项目”?

也许有这个习语的技术定义,不包括构建脚本。但是,如果我们接受这个定义,那么我们必须说您的“项目”不是您需要版本控制的所有内容!

但是,如果我们说“您的项目”就是所做的一切。然后我们可以说您必须将包括在内,并且仅将其包含在VCS中。

对于我们的开发工作,这是非常理论上的,也许不切实际。因此,我们将其更改为“ 您的项目是您需要直接对其进行编辑的每个文件(或文件夹) ”。

“直接”是指“不是间接地”,“间接”是指通过编辑另一个文件,然后效果将反映到该文件中

因此,我们达到了OP所说的(并在这里说):

我认为生成的文件不应该在VCS中。

是。因为尚未创建它们。因此,根据第二个定义,它们不属于“您的项目”。


这些文件的结果是什么:

  • build.gradle:是的。我们需要对其进行编辑。我们的作品应进行版本控制。

    注意:编辑位置没有区别。无论是在文本编辑器环境中还是在Project Structure GUI环境中。无论如何,直接这样做!

  • gradle-wrapper.properties:是的。我们至少需要确定此文件中的Gradle版本。

  • gradle-wrapper.jargradlew [.bat]:到目前为止,我还没有在我的任何开发工作中创建或编辑它们!因此答案是“否”。如果您这样做了,那么答案是对您的工作是“是”(关于您编辑的同一文件)。


有关最新的情况下重要的注意事项是谁克隆你的回购的用户,需要执行这个命令回购的<root-directory>,以自动生成打包程序文件:

> gradle wrapper --gradle-version=$v --distribution-type=$distType

$v并且$distTypegradle-wrapper.properties确定:

distributionUrl=https\://services.gradle.org/distributions/gradle-{$v}-{$distType}.zip

有关更多信息,请参见https://gradle.org/install/

gradle可执行文件bin/gradle[.bat]在本地分发。不需要本地分布与回购中确定的相同。经过包装的文件,然后创建gradlew[.bat]可以下载自动确定摇篮分配(如果不是本地存在)。然后,他/她可能必须gradle按照上述说明使用新的可执行文件(在下载的发行版中)重新生成包装文件。


注意:在上述说明中,假设用户在本地至少有一个 Gradle发行版(例如~/.gradle/wrapper/dists/gradle-4.10-bin/bg6py687nqv2mbe6e1hdtk57h/gradle-4.10)。它涵盖了几乎所有实际案例。但是,如果用户还没有任何发行版怎么办?

他/她可以使用.properties文件中的URL手动下载它。但是,如果他/她未将其定位在包装程序期望的路径中,则包装程序将再次下载它!预期的路径是完全可预测的,但不在主题范围内(有关最复杂的部分,请参见此处)。

还有一些更简单(但肮脏)的方法。例如,他/她可以将包装文件.properties文件除外)从任何其他本地/远程存储库复制到他/她的存储库,然后gradlew在他/她的存储库上运行。它将自动下载合适的发行版。


0

根据Gradle docs的说法,由于将Gradle Wrapper提供给开发人员是Gradle方法的一部分,因此有望添加gradle-wrapper.jar到VCS中:

要使包装器文件可用于其他开发人员和执行环境,您需要将其检入版本控制。包括JAR文件在内的所有包装程序文件都非常小。期望将JAR文件添加到版本控制中。一些组织不允许项目提交二进制文件以进行版本控制。目前,该方法没有其他选择。


0

旧问题,新答案。如果您不经常升级gradle(我们大多数人不升级),最好将其提交到VCS。我的主要原因是提高CI服务器上的构建速度。如今,大多数项目都是由CI服务器来构建和安装的,每次都使用不同的服务器实例。

如果您不提交,CI服务器将为每个构建下载一个jar,这会大大增加构建时间。还有其他方法可以解决此问题,但是我发现这种方法最容易维护。

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.