Contents

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

让我们看看这个命令的输出:

/uploads/gradle_wrapper/1.png

让我们看看这些文件是什么:

  • 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.jargradle-wrapper.properties

如果没有这些文件,我们在使用 Wrapper 运行 Gradle 任务时会出错。因此,我们必须将wrapper文件夹检入源代码控制系统

3.3. 删除的包装文件

基于 Gradle 的项目包含一个*.gradle文件夹,用于存储缓存以加速 Gradle 任务。有时,我们需要清除缓存以解决 Gradle 构建问题。通常,我们会删除整个.gradle文件夹。但是我们可能会将 Wrapper的gradle文件夹与.gradle*文件夹混淆,并将其删除。之后,我们在尝试使用 Wrapper 运行 Gradle 任务时肯定会遇到问题。

我们可以通过从源中提取最新的更改来解决这个问题。或者,我们可以重新生成 Wrapper 文件。