ChatGPT解决这个技术问题 Extra ChatGPT

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

我试图了解 Gradle Wrapper 的工作原理。在许多源代码库中,我看到以下结构:

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

我的问题:

如何/何时生成 gradlew/gradlew.bat?您是否应该只在第一次创建项目时生成它们,是否每次提交/推送更改时都生成它们?它们是如何产生的?上面同样的问题,但对于 gradle/wrapper/* 文件(gradle-wrapper.jar 和 gradle-wrapper.properties)?有时我会在项目的 gradle 目录中看到其他 *.gradle 文件。这些额外的 Gradle 文件是什么,它们代表/做什么?自定义插件?进入 settings.gradle 的属性与应该在 gradle.properties 中定义的属性有什么区别?


O
Opal

当您想更改您在项目中使用的 Gradle 版本时,您会生成一次,并再次生成它。没必要这么频繁地生成。这是文档。只需将包装器任务添加到 build.gradle 文件并运行此任务即可获取包装器结构。请注意,您需要安装 Gradle 才能生成包装器。 SDKMAN! 是管理 g 生态系统工件的绝佳工具。要生成 gradle 包装器,请将以下代码添加到 build.gradle 文件中:task wrapper(type: Wrapper) { gradleVersion = '2.0' //version required } 并运行:gradle wrapper task。将生成的文件添加到 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 选项也可以使用。选项是二进制和allbinall 还包含源代码和文档。 all 在使用 IDE 的时候也比较好,所以编辑器效果更好。缺点是构建可能会持续更长时间(需要下载更多数据,在 CI 服务器上毫无意义)并且会占用更多空间。

这些是 Gradle Wrapper 文件。您需要生成一次(针对特定版本)并添加到版本控制中。如果您需要更改 Gradle Wrapper 的版本,请更改 build.gradle 中的版本,参见 (1.) 并重新生成文件。举个详细的例子。此类文件可能有多种用途:多模块项目、职责分离、脚本稍作修改等。settings.gradle 负责项目的结构(模块、名称等),而 gradle.properties 用于项目的和Gradle 的外部详细信息(版本、命令行参数 -XX、属性等)


感谢@Opal (+1) - 为您提供#3 的具体示例,请参阅 Netflix-Eureka。这些 Gradle 文件是什么?!?
好的,我明白了。据我所知,Netflix 的开发人员只是将一个大的 build.gradle 脚本分成多个更短的脚本,专门用于一个特定目的的脚本。您可以将位于 gradle 目录下的脚本应用于主 build.gradle 文件,查看:github.com/Netflix/eureka/blob/master/build.gradle。你把这些模块放在哪里是你的选择。总的来说就是这样。如果您对答案感到满意,请接受答案:)
另一个有用的命令行选项是 --distribution-type,例如 gradle wrapper --gradle-version 4.3.1 --distribution-type ALL
谢谢@heenenee,将其添加到我的答案中。
提示:Android Studio 在其安装文件夹中有一个 Gradle。
C
Cameron Lowell Palmer

生成 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

您应该将版本设置为最新,您可以check the tools page 并相应地编辑版本。

查看 Android Studio 生成的内容

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

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


taskWrapper 中的 gradleVersion = '2.2' 可以使用我想要的任何版本来生成包装器,对吗?不一定要最新版的gradle?
我想你可以回到 2 系列的 gradle 中。 2.x之前我完全不确定,但是不,它不需要遵循绝对最新的版本。
C
Craig Trader

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


S
Shorn

这是用于告诉 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 不要在构建服务器上下载源代码,请发表评论或提供其他答案。


您确定此设置与库有关吗?官方文档另有说明,仅指包装器本身:“包装器使用的 Gradle 发行版的类型。” docs.gradle.org/current/dsl/…
O
Opal

如果你想下载带有源码和文档的 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")
}

使用更新的 gradle 版本(不确定到底是哪一个) - 而不是手动重写 url,最好在同一个闭包中使用内置命令:distributionType = Wrapper.DistributionType.ALL
d
drafterr

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

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

并运行

gradle wrapper

d
dlamblin

您将生成它们一次,但如果您需要新功能或插件中的某些内容,则需要更新它们,而插件又需要更新的 gradle 版本。最简单的更新方式:从 Gradle 2.2 开始,您可以下载并提取完整或二进制的 Gradle 发行版,然后运行: $ /bin/gradle wrapper 无需定义任务,尽管您可能需要某种构建。 .gradle 文件。这将更新或创建 gradlew 和 gradlew.bat 包装器以及 gradle/wrapper/gradle-wrapper.properties 和 gradle-wrapper.jar 以提供当前版本的 gradle,已包装。这些都是包装的一部分。一些 build.gradle 文件引用其他文件或子目录中的文件,这些文件是子项目或模块。它有点复杂,但如果你有一个项目,你基本上需要一个文件。 settings.gradle 处理项目、模块和其他类型的名称和设置, gradle.properties 为您的 gradle 文件配置可重用变量,如果您愿意并且您觉得这样会更清晰。