如何/何时生成Gradle包装器文件?


212

我正在尝试了解Gradle Wrapper的工作方式。在许多源存储库中,我看到以下结构:

projectRoot/
    src/
    build.gradle
    gradle.properties
    settings.gradle
    gradlew
    gradlew.bat
    gradle/
        wrapper/
            gradle-wrapper.jar
            gradle-wrapper.properties

我的问题:

  1. 一个人如何/何时产生gradlew/ gradlew.bat?您是否应该在首次创建项目时仅生成一次,是否每次提交/推送更改时都生成它们?它们是如何产生的?
  2. 上面的问题相同,但gradle/wrapper/*文件(gradle-wrapper.jargradle-wrapper.properties)?
  3. 有时我*.gradle在项目gradle目录中看到其他文件。这些其他Gradle文件是什么,它们代表/做什么?自定义插件?
  4. settings.gradle与要在内部定义的属性有什么区别gradle.properties

Answers:


250
  1. 当您想更改项目中使用的Gradle版本时,会生成一次。没必要如此频繁地生成。是文档。只需将wrapper任务添加到build.gradle文件并运行此任务即可获取包装器结构。

    请注意,您需要安装Gradle才能生成包装器。SDKMAN是管理g-生态系统工件的绝佳工具。要生成gradle包装器,请在build.gradle文件中添加以下代码:

    task wrapper(type: Wrapper) {
       gradleVersion = '2.0' //version required
    }
    

    并运行:

    gradle wrapper
    

    任务。将生成的文件添加到SCM(例如git),从现在开始,所有使用Gradle Wrapper的开发人员都将具有相同版本的Gradle。

    使用Gradle 2.4(或更高版本),您可以设置包装器而无需添加专用任务:

    gradle wrapper --gradle-version 2.3
    

    要么

    gradle wrapper --gradle-distribution-url https://myEnterpriseRepository:7070/gradle/distributions/gradle-2.3-bin.zip
    

    所有细节都可以在这里找到

3.1 --distribution-type也可以使用From Gradle 选项。选项包括二进制和所有所有这些都另外包含源代码和文档。使用IDE时,一切也都更好,因此编辑器效果更好。缺点是构建可能会持续更长的时间(需要下载更多数据,在CI服务器上毫无意义),并且会占用更多空间。

  1. 这些是Gradle Wrapper文件。您需要生成一次(针对特定版本),然后将其添加到版本控制中。如果您需要更改Gradle Wrapper的版本,build.gradle请参见(1.)中的版本并重新生成文件。

  2. 举一个详细的例子。这样的文件可能有多种用途:多模块项目,职责分离,稍微修改的脚本等。

  3. settings.gradle负责项目的结构(模块,名称等),而gradle.properties负责项目和Gradle的外部细节(版本,命令行参数-XX,属性等)。


感谢@Opal(+1)-给您#3的特定示例,请参阅Netflix-Eureka。这些Gradle文件是什么?!?
smeeb 2014年

好的,我看到了。据我所知,Netflix的开发人员只是将一个大型build.gradle脚本分成多个较短的脚本,并专门用于一种特定目的的脚本。由于可以将位于gradle dir a 下的脚本应用于主build.gradle文件,因此查看:github.com/Netflix/eureka/blob/master/build.gradle。您选择放置此类模块的位置。一般而言。如果您对答案感到满意,请接受答案:)
蛋白石2014年

1
另一个有用的命令行选项是--distribution-type,例如gradle wrapper --gradle-version 4.3.1 --distribution-type ALL
heenenee

1
谢谢@heenenee,将其添加到我的答案中。
蛋白石

提示:Android Studio的安装文件夹中有一个Gradle。
TWiStErRob

29

生成Gradle包装器

项目构建gradle

// Top-level build file where you can add configuration options common to all sub-projects/modules.

// Running 'gradle wrapper' will generate gradlew - Getting gradle wrapper working and using it will save you a lot of pain.
task wrapper(type: Wrapper) {
    gradleVersion = '2.2' 
}

// Look Google doesn't use Maven Central, they use jcenter now.
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.0.1'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

然后在命令行运行

gradle wrapper

如果您在系统上缺少gradle,请安装它,否则上述方法将无法正常工作。在Mac上,最好通过Homebrew安装。

brew install gradle

成功运行包装器任务并生成后gradlew,请勿使用系统gradle。它将为您节省很多麻烦。

./gradlew assemble

上面看到的gradle插件呢?

com.android.tools.build:gradle:1.0.1

您应该将版本设置为最新版本,然后可以检查工具页面并相应地编辑版本。

查看Android Studio生成的内容

gradle的添加和最新的Android Studio大大改变了项目布局。如果您有较旧的项目,我强烈建议您使用最新的Android Studio创建一个干净的项目,并查看Google认为标准项目是什么。

Android Studio具有导入旧项目的功能,这也可以提供帮助。


gradleVersion = '2.2'taskWrapper可以使用任何版本我产生了包装的愿望,是否正确?不一定是gradle的最新版本?
拉菲安

1
我想你可以回到2系列的gradle中了。我完全不确定2.x之前的版本,但是不,它不需要遵循绝对的最新版本。
卡梅隆·洛厄尔·帕尔默

18

从Gradle 2.4开始,您可以gradle wrapper --gradle-version X.X配置特定版本的Gradle包装器,而无需在build.gradle文件中添加任何任务。下次使用包装器时,它将下载适当的Gradle发行版以进行匹配。


10

如果要下载带有源代码和文档的gradle,则gradle-wrapper.properites中配置的默认分发URL将无法满足您的需求,它是https://services.gradle.org/distributions/gradle-2.10-bin.zip,不是https://services.gradle.org/distributions/gradle-2.10-all.zip。此完整网址由IDE(例如Android Studio)建议。如果要下载完整的gradle,则可以像这样配置wrapper任务:

task wrapper(type: Wrapper) {
    gradleVersion = '2.13'
    distributionUrl = distributionUrl.replace("bin", "all")
}

1
使用gradle的最新版本(不确定确切的版本)-而不是手动重写url,最好在同一闭包中使用内置命令:distributionType = Wrapper.DistributionType.ALL
Dave Birch

6

这是用于告诉Gradle升级包装程序的命令,以便它将获取包含源代码的库的发行版本:

./gradlew wrapper --gradle-version <version> --distribution-type all

用“ all”指定发布类型将确保Gradle下载源文件供开发环境使用。

优点

  • IDE将立即访问源代码。例如,Intellij IDEA不会提示您更新构建脚本以包括源发行版(因为此命令已经这样做了)

缺点

  • 构建过程更长/更大,因为它正在下载源代码。这在不需要源代码的构建或CI服务器上浪费了时间/空间。

如果您知道任何命令行选项来告诉Gradle不要在构建服务器上下载源代码,请发表评论或提供其他答案。


1
您确定此设置与库有关吗?官方文档另有说明,仅引用包装器本身:“包装器将使用的Gradle分布类型。” docs.gradle.org/current/dsl/...
托尔斯滕Schöning

2
  1. 您将生成它们一次,但是如果您需要新功能或插件中的某些东西(反过来需要较新的gradle版本)则对其进行更新。

    最简单的更新方法:从Gradle 2.2开始,您可以下载并提取完整或二进制的Gradle发行版,然后运行:

    $ <pathToExpandedZip>/bin/gradle wrapper
    

    尽管您可能需要某种build.gradle文件,但无需定义任务。

    这将更新或创建gradlewgradlew.bat包装器以及gradle/wrapper/gradle-wrapper.properties和,gradle-wrapper.jar以提供已包装的gradle的当前版本。

  2. 这些都是包装的一部分。

  3. 一些build.gradle文件引用其他文件或作为子项目或模块的子目录中的文件。它有点复杂,但是如果您有一个项目,则基本上只需要一个文件。

  4. settings.gradle处理项目,模块以及其他类型的名称和设置,gradle.properties如果愿意,可以为gradle文件配置可重用的变量,这样您会觉得它们会更清晰。


2

由于Gradle内置任务在4.8中已弃用,请尝试以下操作

wrapper {
   gradleVersion = '2.0' //version required
}

并运行

gradle wrapper
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.