如何/何时生成 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.jar
和 gradle-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
选项也可以使用。选项是二进制和all 和bin。 all 还包含源代码和文档。 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
文件。
这将更新或创建 gradlew
和 gradlew.bat
包装器以及 gradle/wrapper/gradle-wrapper.properties
和 gradle-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 为 Android 项目生成 Eclipse 和 Intellij 项目文件
Java 8,Gradle 3 上的 Spring Boot 应用程序的 gradle 包装器失败:找不到 cacerts