【问题标题】:How/when to generate Gradle wrapper files?如何/何时生成 Gradle 包装文件?
【发布时间】: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

我的问题:

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

【问题讨论】:

    标签: gradle build.gradle gradlew


    【解决方案1】:
    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 服务器上毫无意义)并且会占用更多空间。

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

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

    3. 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】:
      1. 您将生成一次,但如果您需要新功能或插件中的某些内容,则需要更新它们,而插件又需要更新的 gradle 版本。

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

        $ <pathToExpandedZip>/bin/gradle wrapper
        

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

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

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

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

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

        李>

      【讨论】:

        【解决方案7】:

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

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

        然后运行

        gradle wrapper
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-10-13
          • 1970-01-01
          • 1970-01-01
          • 2012-04-24
          • 1970-01-01
          • 1970-01-01
          • 2023-03-17
          • 1970-01-01
          相关资源
          最近更新 更多