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

Posted

技术标签:

【中文标题】如何/何时生成 Gradle 包装文件?【英文标题】:How/when to generate Gradle wrapper files? 【发布时间】:2014-11-04 08:17:21 【问题描述】:

我正在尝试了解 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.jargradle-wrapper.properties)? 有时我会在项目的gradle 目录中看到其他*.gradle 文件。这些额外的 Gradle 文件是什么,它们代表/做什么?自定义插件? settings.gradle 中的属性与 gradle.properties 中应定义的属性有何区别?

【问题讨论】:

【参考方案1】:

    当您想更改项目中使用的 Gradle 版本时,您会生成一次,然后再生成一次。没必要这么频繁地生成。 Here 是文档。只需将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
    

    所有详情都可以找到here

From 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。【参考方案2】:

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

【讨论】:

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

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

【讨论】:

【参考方案4】:

如果你想下载带有源码和文档的 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 【参考方案5】:

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

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

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

优点

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

缺点

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

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

【讨论】:

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

    您将生成一次,但如果您需要新功能或插件中的某些内容,则需要更新它们,而插件又需要更新的 gradle 版本。

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

    $ <pathToExpandedZip>/bin/gradle wrapper
    

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

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

    这些都是包装的一部分。

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

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

    李>

【讨论】:

【参考方案7】:

由于 4.8 中不推荐使用 gradle 内置任务,请在下面尝试

wrapper 
   gradleVersion = '2.0' //version required

然后运行

gradle wrapper

【讨论】:

以上是关于如何/何时生成 Gradle 包装文件?的主要内容,如果未能解决你的问题,请参考以下文章

spring boot gradle 插件、应用程序插件和 gradle 2.3 包装器

包装器的使用

如何使用Gradle为Android项目生成Eclipse和Intellij项目文件

如何使用 gradle 构建源 jar?

如何使用 Gradle 为 Android 项目生成 Eclipse 和 Intellij 项目文件

Java 8,Gradle 3 上的 Spring Boot 应用程序的 gradle 包装器失败:找不到 cacerts