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

256

我正在努力理解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.gradlegradle.properties 中的属性有何区别?哪些属性应该在 settings.gradle 中定义,哪些应该在 gradle.properties 中定义?
10个回答

299
  1. 生成一次,如果想要更改项目中使用的Gradle版本,则再次生成。不需要那么频繁地生成。文档在这里。只需将wrapper任务添加到build.gradle文件中,并运行此任务以获取包装器结构即可。

    请注意,在生成包装器之前,您需要已安装Gradle。管理g生态系统工件的好工具是SDKMAN!。要生成Gradle包装器,请将以下代码片段添加到build.gradle文件中:

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

并运行:

gradle wrapper

任务完成后,将生成的文件添加到版本控制工具(例如git)中,从此以后所有的开发者在使用Gradle Wrapper时都会使用相同的Gradle版本。

使用Gradle2.4(或更高版本),您可以设置一个包装器而无需添加专用任务:

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

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

从Gradle 3.1版本开始,还可以使用--distribution-type选项。选项有二进制和allbinall 包含源代码和文档。当使用IDE时,all更好,因此编辑器的工作效果更佳。缺点是构建可能需要更长时间(需要下载更多数据,在CI服务器上毫无意义),并且它将占用更多空间。

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

  2. 给出详细的示例。这样的文件可能具有多种用途:多模块项目、职责分离、稍微修改脚本等。

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


感谢 @Opal (+1) - 给你一个关于问题3的具体例子,请参见 Netflix-Eureka。这些Gradle文件是什么?!? - smeeb
好的,我明白了。据我所见,Netflix的开发人员将一个大的build.gradle脚本分成了多个较短且专用于特定目的的脚本。正如您所看到的那样,该脚本位于gradle目录下,并应用于主build.gradle文件,查看:https://github.com/Netflix/eureka/blob/master/build.gradle。您可以自行选择放置这样的*模块*。总的来说就是这样。如果您对答案满意,请接受答案 :) - Opal
2
另一个有用的命令行选项是 --distribution-type,例如 gradle wrapper --gradle-version 4.3.1 --distribution-type ALL - heenenee
1
谢谢@heenenee,我会把它加入到我的答案中。 - Opal
安装Gradle后,我遇到了这个错误 java: symbol lookup error: /usr/lib/jni/libnative-platform-curses.so: undefined symbol: tgetent 你有任何想法吗? - Mina Samir
显示剩余2条评论

33

生成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有导入旧项目的功能,这也可以帮助你。

taskWrapper中,gradleVersion = '2.2'可以使用我想要的任何版本来生成wrapper,对吗?不一定是最新版本的gradle? - raffian
1
我想你可以回到gradle的2系列。我不确定在2.x之前的版本,但是不需要遵循绝对最新的版本。 - Cameron Lowell Palmer

22
从Gradle 2.4版本开始, 你可以使用gradle wrapper --gradle-version X.X来配置特定版本的Gradle包装器, 而无需在build.gradle文件中添加任何任务。 下一次使用包装器时, 它将下载相应的Gradle分发以匹配指定版本。

17

这是使用的命令,告诉Gradle升级包装器,以便获取Gradle jars(仅Gradle,不包括库)的发行版本,其中包括源代码:

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

现在可以使用Gradle自身进行此操作,将您的根build.gradle更改为以下内容:

tasks.named('wrapper') {
  distributionType = Wrapper.DistributionType.ALL
  gradleVersion = '7.5'
}

升级Gradle Wrapper的方法:只需将代码更改为新版本并运行wrapper任务,不需要任何参数。

使用“all”指定分发类型可以确保Gradle下载可供开发环境使用的自身源文件。

优点:

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

缺点:

  • 较长/较大的构建过程,因为它正在下载Gradle源代码。这是在构建或CI服务器上浪费时间/空间的操作,因为源代码不是必需的(Gradle 7.4的大小为110MB vs 150MB)。

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


3
你确定这个设置是关于库的吗?官方文档说得不一样,只涉及到包装器本身:“Gradle包装器要使用的Gradle发行版类型。” https://docs.gradle.org/current/dsl/org.gradle.api.tasks.wrapper.Wrapper.html#org.gradle.api.tasks.wrapper.Wrapper:distributionType - Thorsten Schöning

10

如果您想下载带有源代码和文档的 Gradle,那么在 Gradle Wrapper 配置文件中默认的分发 URL 无法满足您的需求。正确的下载地址是 https://services.gradle.org/distributions/gradle-2.10-bin.zip 而不是 https://services.gradle.org/distributions/gradle-2.10-all.zip。像 Android Studio 这样的 IDE 建议使用完整的 URL。如果您要下载完整的 Gradle,可以像这样配置 wrapper 任务:

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

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

5

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

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

并运行

gradle wrapper

2
  1. You will generate them once, but update them if you need a new feature or something from a plugin which in turn needs a newer gradle version.

    Easiest way to update: as of Gradle 2.2 you can just download and extract the complete or binary Gradle distribution, and run:

    $ <pathToExpandedZip>/bin/gradle wrapper
    

    No need to define a task, though you probably need some kind of build.gradle file.

    This will update or create the gradlew and gradlew.bat wrapper as well as gradle/wrapper/gradle-wrapper.properties and the gradle-wrapper.jar to provide the current version of gradle, wrapped.

  2. Those are all part of the wrapper.

  3. Some build.gradle files reference other files or files in subdirectories which are sub projects or modules. It gets a bit complicated, but if you have one project you basically need the one file.

  4. settings.gradle handles project, module and other kinds of names and settings, gradle.properties configures resusable variables for your gradle files if you like and you feel they would be clearer that way.


1
如果您正在使用Gradle 7.3.3或更高版本,您只需打开终端并运行以下命令即可:
gradle wrapper

就是这样!


0
这是使用 Gradle 8.2 测试的 Kotlin DSL 的另一种语法(build.gradle.kts)。
tasks.wrapper {
    gradleVersion = 8.2 // OR, for example, properties["gradle.version"] as String
    networkTimeout = 60_000 // milliseconds
    distributionType = Wrapper.DistributionType.ALL // Includes JavaDoc and source code
    validateDistributionUrl = false
}

然后,使用此命令生成/更新包装器:

./gradlew wrapper

嗨,Mahozad,你能帮帮我吗?在这里 -> https://stackoverflow.com/questions/76786965/facing-issue-while-validating-amongst-the-edittexts-in-recyclerview - android dev

0
只需删除gradle文件夹并同步项目,它将生成完整的gradle文件夹,包括: - gradlle->wrapper->[[gradle-wrapper.jar, gradle-wrapper.properties]] - 开心编码..... :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接