我想了解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
内应定义的属性有何不同?答案 0 :(得分:222)
您生成一次,当您想要更改在项目中使用的Gradle版本时再次生成它。没有必要经常生成。 Here是文档。只需将wrapper
任务添加到build.gradle
文件并运行此任务即可获取包装器结构。
请注意,您需要安装 Gradle 才能生成包装器。管理g-ecosystem工件的好工具是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
也可以使用Gradle 3.1
--distribution-type
选项。选项是二进制和所有和 bin 。 所有还包含源代码和文档。使用IDE时,所有也更好,因此编辑器工作得更好。缺点是构建可能会持续更长时间(需要下载更多数据,在CI服务器上无意义)并且需要更多空间。
这些是Gradle Wrapper文件。您需要生成一次(对于特定版本)并添加到版本控制。如果您需要更改Gradle Wrapper的版本,请更改build.gradle
中的版本,请参阅(1.)并重新生成文件。
举一个详细的例子。这样的文件可能有多种用途:多模块项目,责任分离,略微修改的脚本等。
settings.gradle
负责项目的结构(模块,名称等),而gradle.properties
用于项目和Gradle的外部细节(版本,命令行参数-XX
,属性等。)
答案 1 :(得分:25)
// 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
com.android.tools.build:gradle:1.0.1
您应该将版本设置为最新版本,然后您可以check the tools page并相应地修改版本。
添加gradle和最新的Android Studio大大改变了项目布局。如果您有一个较旧的项目,我强烈建议您使用最新的Android Studio创建一个干净的项目,并查看Google认为标准项目的内容。
Android Studio具有导入较旧项目的功能,这些功能也可以提供帮助。
答案 2 :(得分:15)
从Gradle 2.4开始,您可以使用gradle wrapper --gradle-version X.X
配置特定版本的Gradle包装器,而无需向build.gradle
文件添加任何任务。下次使用包装器时,它将下载相应的Gradle分发以匹配。
答案 3 :(得分:8)
如果您要下载包含源和文档的gradle,则在gradle-wrapper.properites中配置的默认分发网址将无法满足您的需求。它是 https://services.gradle.org/distributions/gradle- 2.10-bin.zip ,而不是 https://services.gradle.org/distributions/gradle-2.10-all.zip 。这个完整的网址是由IDE(如Android Studio)建议的。如果要下载完整的gradle,可以像下面这样配置包装器任务:
task wrapper(type: Wrapper) {
gradleVersion = '2.13'
distributionUrl = distributionUrl.replace("bin", "all")
}
答案 4 :(得分:2)
这是用于告诉Gradle升级包装器的命令,以便它将获取包含源代码的库的分发版本:
./gradlew wrapper --gradle-version <version> --distribution-type all
使用“all”指定分发类型将确保Gradle下载源文件以供开发环境使用。
<强>赞成强>:
<强>缺点强>:
如果您知道有任何命令行选项告诉Gradle不要在构建服务器上下载源,请发表评论或提供其他答案。
答案 5 :(得分:1)
您将生成一次,但如果您需要新功能或插件中的某些东西,则需要更新它们,而插件又需要更新的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文件配置可重复使用的变量,并且您觉得它们会更清晰。
答案 6 :(得分:0)
由于Gradle内置任务在4.8中已弃用,请尝试以下操作
wrapper {
gradleVersion = '2.0' //version required
}
并运行
gradle wrapper