我试图了解 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 中定义的属性有什么区别?
当您想更改您在项目中使用的 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
选项也可以使用。选项是二进制和all 和bin。 all 还包含源代码和文档。 all 在使用 IDE 的时候也比较好,所以编辑器效果更好。缺点是构建可能会持续更长时间(需要下载更多数据,在 CI 服务器上毫无意义)并且会占用更多空间。
这些是 Gradle Wrapper 文件。您需要生成一次(针对特定版本)并添加到版本控制中。如果您需要更改 Gradle Wrapper 的版本,请更改 build.gradle 中的版本,参见 (1.) 并重新生成文件。举个详细的例子。此类文件可能有多种用途:多模块项目、职责分离、脚本稍作修改等。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
您应该将版本设置为最新,您可以check the tools page 并相应地编辑版本。
查看 Android Studio 生成的内容
gradle 和最新的 Android Studio 的加入极大地改变了项目布局。如果您有一个较旧的项目,我强烈建议您使用最新的 Android Studio 创建一个干净的项目,然后看看 Google 认为标准项目是什么。
Android Studio 具有导入旧项目的工具,这也可以提供帮助。
taskWrapper
中的 gradleVersion = '2.2'
可以使用我想要的任何版本来生成包装器,对吗?不一定要最新版的gradle?
从 Gradle 2.4 开始,您可以使用 gradle wrapper --gradle-version X.X
配置特定版本的 Gradle 包装器,而无需向 build.gradle
文件添加任何任务。下次使用包装器时,它会下载适当的 Gradle 发行版以进行匹配。
这是用于告诉 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,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")
}
由于 4.8 中不推荐使用 gradle 内置任务,请尝试以下操作
wrapper {
gradleVersion = '2.0' //version required
}
并运行
gradle wrapper
您将生成它们一次,但如果您需要新功能或插件中的某些内容,则需要更新它们,而插件又需要更新的 gradle 版本。最简单的更新方式:从 Gradle 2.2 开始,您可以下载并提取完整或二进制的 Gradle 发行版,然后运行: $
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