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

我试图了解如何Gradle包装工作。在许多源代码回购中,我看到了以下结构:

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中应该定义的属性有什么区别?
219226 次浏览
  1. 你生成它一次,当你想要改变项目中使用的Gradle版本时再生成一次。没有必要经常生成is。在这里是文档。只需将wrapper任务添加到build.gradle文件中,并运行此任务以获得包装器结构。

    注意,你需要有Gradle安装来生成包装器。管理g-生态系统工件的好工具是SDKMAN !。要生成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
    

    所有细节都可以在在这里

    中找到

从Gradle 3.1 --distribution-type选项也可以使用。选项是二进制和所有箱子所有还包含源代码和文档。当使用IDE时,所有也更好,因此编辑器工作得更好。缺点是构建可能会持续更长的时间(需要下载更多的数据,在CI服务器上毫无意义),它将占用更多的空间。

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

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

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

生成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创建一个干净的项目,看看谷歌认为标准项目是什么。

Android Studio有导入旧项目的功能,这也有帮助。

  1. 你只会生成一次,但是如果你需要一个新特性或者插件的某些东西,而这些东西又需要一个更新的gradle版本,你就会更新它们。

    最简单的更新方式: 从Gradle 2.2开始,你可以下载并提取完整的或二进制Gradle分布,然后运行:

    $ <pathToExpandedZip>/bin/gradle wrapper
    

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

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

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

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

  4. settings.gradle处理项目、模块和其他类型的名称和设置,gradle.properties为你的gradle文件配置可重用变量,如果你喜欢的话,你觉得这样会更清楚。

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

如果你想下载带有源代码和文档的gradle,在gradle-wrapper中配置的默认分发url。财产不能满足你的需要。它是https://services.gradle.org/distributions/gradle-2.10-bin.zip,不是https://services.gradle.org/distributions/gradle-2.10-all.zip。这个完整的url是由IDE建议的,如Android Studio。如果你想下载完整的gradle,你可以这样配置包装任务:

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

这是用来告诉Gradle升级包装器的命令,这样它就会抓取包含源代码的Gradle jar(只是Gradle,不是库)的分发版本:

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

这现在可以使用Gradle构建本身来完成,改变你的根build.gradle来包含:

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


现在升级gradle包装器:只需将代码更改为新版本,并运行wrapper任务,不带任何参数。

使用"all"将确保Gradle为自己下载源文件,这些文件可以被你的开发环境使用。

优点:

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

缺点:

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

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

由于gradle内置任务在4.8中已弃用,请尝试以下内容

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

和运行

gradle wrapper