235

我试图了解 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
4

7 回答 7

279
  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也可以使用来自 Gradle的选项。选项是 binary 和allbinall还包含源代码和文档。使用IDE时all也更好,因此编辑器工作得更好。缺点是构建可能会持续更长时间(需要下载更多数据,在 CI 服务器上毫无意义)并且会占用更多空间。

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

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

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

于 2014-09-10T16:09:42.707 回答
32

生成 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 具有导入旧项目的工具,这也可以提供帮助。

于 2015-01-16T11:28:56.670 回答
21

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

于 2015-08-19T09:57:25.327 回答
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。这个完整的 url 是由 Android Studio 等 IDE 建议的。如果你想下载完整的 gradle,你可以像这样配置包装器任务:

task wrapper(type: Wrapper) {
    gradleVersion = '2.13'
    distributionUrl = distributionUrl.replace("bin", "all")
}
于 2016-06-30T03:06:07.820 回答
9

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

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

使用“all”指定分发类型将确保 Gradle 为自己下载可被您的开发环境使用的源文件。

优点

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

缺点

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

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

于 2017-10-05T23:29:58.593 回答
2
  1. 您将生成它们一次,但如果您需要新功能或插件中的某些内容,则需要更新它们,而插件又需要更新的 gradle 版本。

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

    $ <pathToExpandedZip>/bin/gradle wrapper
    

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

    这将更新或创建gradlewand gradlew.batwrapper 以及gradle/wrapper/gradle-wrapper.propertiesandgradle-wrapper.jar以提供当前版本的 gradle,wrapped。

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

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

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

于 2015-08-17T21:05:45.790 回答
2

由于 4.8 中不推荐使用 gradle 内置任务,请尝试以下操作

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

并运行

gradle wrapper
于 2019-10-21T08:55:49.053 回答