Gradle Wrapper 简介
1. 概述
开发人员通常使用Gradle 来管理其项目的构建生命周期。它是所有新 Android 项目的构建工具的默认选择。
在本教程中,我们将了解 Gradle Wrapper,它是一个附带的实用程序,可以更轻松地分发项目。
2. Gradle 包装器
要构建一个基于 Gradle 的项目,我们需要在我们的机器上安装 Gradle。但是,如果我们安装的版本与项目的版本不匹配,我们可能会面临很多不兼容的问题。
Gradle Wrapper,也简称为Wrapper,解决了这个问题。它是一个运行带有声明版本的 Gradle 任务的脚本。如果未安装声明的版本,Wrapper 会安装所需的版本。
Wrapper 的主要好处是我们可以:
- 在任何机器上使用 Wrapper 构建项目,无需先安装 Gradle
- 有一个固定的 Gradle 版本。这会在 CI 管道上产生可重用且更健壮的构建
- 通过更改 Wrapper 定义轻松升级到新的 Gradle 版本
在接下来的部分中,我们将运行需要在本地安装 Gradle 的Gradle 任务。
2.1. 生成包装文件
要使用 Wrapper,我们需要生成一些特定的文件。**我们将使用名为wrapper的内置 Gradle 任务生成这些文件。**请注意,我们只需要生成这些文件一次。
现在,让我们在项目目录中运行wrapper任务:
$ gradle wrapper
让我们看看这个命令的输出:
让我们看看这些文件是什么:
- gradle-wrapper.jar包含用于下载gradle-wrapper.properties文件中指定的 Gradle 分发的代码
- gradle-wrapper.properties包含 Wrapper 运行时属性——最重要的是,与当前项目兼容的 Gradle 发行版版本
- gradlew是使用 Wrapper 执行 Gradle 任务的脚本
- gradlew.bat是适用于 Windows 机器的gradlew等效批处理脚本
默认情况下,wrapper任务会生成带有当前安装在机器上的 Gradle 版本的包装器文件。如果需要,我们可以指定另一个版本:
$ gradle wrapper --gradle-version 6.3
**我们建议将 Wrapper 文件检查到 GitHub 等源代码控制系统中。**通过这种方式,我们确保其他开发人员无需安装 Gradle 即可运行该项目。
2.2. 使用 Wrapper 运行 Gradle 命令
我们可以通过将gradle替换为gradlew来使用 Wrapper 运行任何 Gradle 任务。
要列出可用的任务,我们可以使用gradlew tasks命令:
$ gradlew tasks
让我们看看输出:
## Help tasks
buildEnvironment - Displays all buildscript dependencies declared in root project 'gradle-wrapper'.
components - Displays the components produced by root project 'gradle-wrapper'. [incubating]
dependencies - Displays all dependencies declared in root project 'gradle-wrapper'.
dependencyInsight - Displays the insight into a specific dependency in root project 'gradle-wrapper'.
dependentComponents - Displays the dependent components of components in root project 'gradle-wrapper'. [incubating]
help - Displays a help message.
model - Displays the configuration model of root project 'gradle-wrapper'. [incubating]
outgoingVariants - Displays the outgoing variants of root project 'gradle-wrapper'.
projects - Displays the sub-projects of root project 'gradle-wrapper'.
properties - Displays the properties of root project 'gradle-wrapper'.
tasks - Displays the tasks runnable from root project 'gradle-wrapper'.
如我们所见,输出与使用gradle命令运行此任务时得到的输出相同。
3. 常见问题
现在,让我们看看我们在使用 Wrapper 时可能会遇到的一些常见问题。
3.1. 忽略所有 Jar 文件的全局 .gitignore
一些组织不允许开发人员将 jar 文件签入他们的源代码控制系统。通常,此类项目在全局*.gitignore文件中具有忽略所有 jar 文件的规则。因此,不会将gradle-wrapper.jar文件签入 git 存储库。因此,Wrapper 任务无法在其他机器上运行。在这种情况下,**我们需要将gradle-wrapper.jar*文件强制添加到 git 中**:
git add -f gradle/wrapper/gradle-wrapper.jar
同样,我们可能有一个忽略 jar 文件的项目特定的*.gitignore文件。我们可以通过放松.gitignore*规则或强制添加包装器 jar 文件来修复它,如上所示。
3.2. 缺少包装文件夹
在签入基于 Wrapper 的项目时,我们可能会忘记包含gradle文件夹中存在的wrapper文件夹。但正如我们在上面看到的,wrapper文件夹包含两个关键文件:gradle-wrapper.jar和gradle-wrapper.properties。
如果没有这些文件,我们在使用 Wrapper 运行 Gradle 任务时会出错。因此,我们必须将wrapper文件夹检入源代码控制系统。
3.3. 删除的包装文件
基于 Gradle 的项目包含一个*.gradle文件夹,用于存储缓存以加速 Gradle 任务。有时,我们需要清除缓存以解决 Gradle 构建问题。通常,我们会删除整个.gradle文件夹。但是我们可能会将 Wrapper的gradle文件夹与.gradle*文件夹混淆,并将其删除。之后,我们在尝试使用 Wrapper 运行 Gradle 任务时肯定会遇到问题。
我们可以通过从源中提取最新的更改来解决这个问题。或者,我们可以重新生成 Wrapper 文件。