vlambda博客
学习文章列表

读书笔记《gradle-essentials》运行您的第一个Gradle任务

Chapter 1. Running Your First Gradle Task

我们正在快速学习Gradle Essentials。首先,我们将首先安装 Gradle。然后,我们将通过查看 gradle 命令的用法来熟悉 Gradle 的命令行界面。此外,在本章结束时,我们将运行我们的第一个 Gradle 构建脚本。

构建软件工件是一个复杂的过程,涉及各种活动,例如编译源代码、运行自动化测试、打包可分发文件等。这些活动进一步分为许多步骤,通常取决于执行顺序、获取相关工件、解析配置变量等。手动执行所有这些活动很麻烦,而且经常容易出错。一个好的构建自动化工具可以帮助我们减少以可重复方式构建正确工件所需的工作量和时间。

Gradle 是一种先进的构建自动化工具,它从各种经过验证的构建工具中汲取精华,并在它们之上进行创新。 Gradle 可用于生成工件,例如 Web 应用程序、应用程序库、文档、静态站点、移动应用程序、命令行和桌面应用程序。 Gradle 可用于构建基于各种语言和技术栈的项目,例如 Java、C/C++、Android、Scala、Groovy、Play、Grails 等等。作为 Java 虚拟机 (< strong>JVM) 恰好是 Gradle 支持的一流平台之一,本书中的示例将主要侧重于构建基于 Java 的项目。

Gradle 让我们可以像 Ant 一样完全控制构建,但无需通过以约定的形式提供智能默认值来重复我们自己。 Gradle 真正按照约定而不是配置工作,就像 Maven 一样。但是,当我们需要偏离时,它永远不会妨碍我们。这也使它与 Maven 形成了鲜明的对比。 Gradle 试图在约定和可配置性之间保持适当的平衡。

上一代的构建工具,例如 Ant 和 Maven,选择 XML 来表示构建逻辑。虽然 XML 是人类可读的,但它更像是一种机器友好的格式(更容易被程序读取/写入)。它非常适合表示和交换分层数据,但是在编写任何逻辑时,即使是最简单的逻辑也很容易占用数百行代码。另一方面,可以使用非常人性化的 Groovy DSL 配置 Gradle 构建。 Groovy 是一种功能强大、富有表现力和低仪式性的动态语言,非常适合构建脚本。

Gradle 本身是一个用 Java 和 Groovy 编写的 JVM 应用程序。由于 Gradle 在 JVM 上运行,它在 Windows、Mac OS X 和 Linux 上的运行方式相同。 Gradle 还拥有一个高级依赖解析系统,可以解析来自现有 Maven 和 Ivy 存储库甚至文件系统的依赖关系。

多年来,Gradle 已经成熟成为一个非常稳定的开源项目,拥有活跃的贡献者和商业支持。丰富的插件生态系统和充满活力的社区使 Gradle 成为各种项目的绝佳选择。 Gradle 已经拥有令人印象深刻的采用者名单,其中包括 Google Android、LinkedIn、Unity 3D、Netflix 等科技巨头。 Spring、Hibernate 和 Grails 等开源库和框架正在使用 Gradle 为其构建提供支持。

Installing Gradle


在我们继续运行 Gradle 之前,我们必须在我们的机器上安装它。可以通过多种方式安装和更新 Gradle。我们将首先看到一种更手动的方式来安装 Gradle,然后通过一些常用的包管理器快速了解如何安装它。我们可以选择任何一种符合要求的方法。无论我们安装 Gradle 的方式如何,我们都必须满足以下先决条件。

Gradle 需要 Java 运行时环境 ( JRE) 6 或 Java 开发工具包 (JDK) 1.6 或更高版本。没有其他依赖。我们建议安装 JDK。为了验证这一点,在命令行中,我们可以使用以下命令检查 Java 版本:

$ java -version 
java version "1.8.0"
Java(TM) SE Runtime Environment (build 1.8.0-b132)
Java HotSpot(TM) 64-Bit Server VM (build 25.0-b70, mixed mode)

如果我们没有看到或多或少像前面命令中显示的输出,则说明我们的 JDK 安装有问题。

Note

可以从以下 URL 下载最新的 JDK:

http://www.oracle.com/technetwork/ java/javase/downloads/index.html

Installing manually

如果我们想要更好地控制安装,那么这是一条合适的路线。当我们无法使用包管理器,想要下载和安装非常特定的二进制文件时,或者在不允许包管理器自动下载的公司防火墙后面时,可能就是这种情况。我们需要下载 Gradle 二进制文件并使其可用于命令行。

最新的 Gradle 发行版可以从 http://www.gradle.org/downloads。在撰写本文时,最新版本是 2.9。

Gradle 二进制分发有以下两种形式:

  • gradle-2.9-all.zip:包含二进制文件、源代码和文档

  • gradle-2.9-bin.zip:仅包含二进制文件

我们可以根据需要下载以上任何内容。此外,这是一个独立于操作系统的 zip,因此可以在 Mac OS X、Windows 和 Linux 上提取相同的 zip。下一部分使 Gradle 命令在命令行上可用。这部分取决于我们使用的操作系统。

Installing on Mac OS X and Linux

假设 我们将下载的 zip 解压缩为 ~/gradle-2.9/。现在,我们只需在 .bashrc/、.bash_profile/ 或 / 的末尾添加以下两行class="literal">.zshrc,取决于我们使用的操作系统和外壳:

export GRADLE_HOME=~/gradle-2.9
export PATH=$PATH:$GRADLE_HOME/bin

重新启动 终端或获取修改后的文件以使更改生效。

Installing on Windows

假设我们 将 zip 解压缩为 C:\gradle-2.9,然后执行以下步骤:

  1. 打开开始菜单,右键单击计算机并选择属性 .

  2. 高级系统设置 上,选择 高级 标签,然后选择 环境变量...

    读书笔记《gradle-essentials》运行您的第一个Gradle任务
  3. 点击新建上的

  4. 创建一个 GRADLE_HOME 环境变量,其值为 C:\gradle-2.9

    Tip

    下载示例代码

    您可以从您的帐户下载示例代码文件,网址为 http://www.packtpub.com对于您购买的所有 Packt Publishing 书籍。如果您在其他地方购买了这本书,您可以访问 http://www.packtpub.com/support< /a> 并注册以将文件直接通过电子邮件发送给您。

    读书笔记《gradle-essentials》运行您的第一个Gradle任务

    Tip

    将来当我们下载更高版本的 Gradle 时,我们需要更改此值以指向正确的文件夹。

  5. 编辑(或添加,如果还没有的话)PATH 环境变量。在其值的末尾,附加 ;%GRADLE_HOME%\bin (如果存在多个路径条目,则添加分号)。

Alternate methods of installing Gradle

虽然手动安装可以完全控制安装过程,但各种任务,例如下载和解压正确版本、升级到最新版本、卸载和编辑环境变量很快变得繁琐且容易出错。这就是为什么许多人更喜欢包管理器来控制整个过程。

Installing via OS-specific package managers

虽然 手动安装(如上一节所述)非常容易,但我们可以使用包管理器使其超级简单。

一些 Linux 发行版(例如 Ubuntu)附带了它们的包管理器、Mac OS X、Windows 默认没有安装任何包管理器。但是,幸运的是,这两个平台都有多个包管理器可用。我们将看到 Mac 上的 Homebrew 和 Windows 上的 Chocolatey 的示例。

Mac OS X

确保 我们已安装 Homebrew。如果是,安装 Gradle 只需使用以下命令:

$ brew install gradle

Note

有关 Homebrew 的更多详细信息,请访问 http://brew.sh

Linux (Ubuntu)

使用 Ubuntu 内置的包管理器,称为高级打包工具 (APT),我们可以使用以下命令安装 Gradle:

$ sudo apt-get install gradle
Windows

如果我们安装了 Chocolatey,安装 Gradle 只需一个命令:

c:\> cinst gradle

Note

有关 Chocolatey 的更多详细信息,请访问 https://chocolatey.org

Installing via SDKMAN

SDKMAN 代表 软件开发工具包管理器。用它自己的话来说,该网站将其描述为:SDKMAN!是用于在大多数基于 Unix 的系统上管理多个软件开发工具包的并行版本的工具。

SDKMAN 相对于其他包管理器的优势在于我们可以在系统上安装多个 Gradle 版本,并为给定项目选择不同的版本。如果我们安装了它,我们需要做的就是运行以下命令:

$ sdk install gradle

SDKMAN 可以从 http://sdkman.io/ 安装。

Verifying the installation

中,无论我们选择哪种方式安装 Gradle,在我们继续之前验证它是否正常工作是个好主意。我们可以通过简单地在命令行上检查 Gradle 的版本来做到这一点:

$ gradle --version
------------------------------------------------------------
Gradle 2.9
------------------------------------------------------------

Build time:   2015-11-17 07:02:17 UTC
Build number: none
Revision:     b463d7980c40d44c4657dc80025275b84a29e31f

Groovy:       2.4.4
Ant:          Apache Ant(TM) version 1.9.3 compiled on December 23 2013
JVM:          1.8.0_25 (Oracle Corporation 25.25-b02)
OS:           Mac OS X 10.10.5 x86_64

如果我们看到与上面类似的输出,我们的机器上已经正确安装了 Gradle。

Tip

我们可以使用 -v 而不是 --version 来获得相同的结果。

Setting JVM options

虽然大部分时间都不需要 ,但是如果我们需要为 Gradle 将使用的 JVM 设置一些全局选项,Gradle 为我们提供了一个方便的方法来做到这一点。我们可以使用可接受的标志设置 GRADLE_OPTS 环境变量来调整 JVM。

Gradle 还支持 JAVA_OPTS 环境变量。但是,我们在设置时需要小心,因为这会影响机器上所有 Java 程序的设置。我们希望对所有 Java 应用程序保持通用的设置应该通过这个变量来完成,而那些只需要应用于 Gradle 的设置应该通过 GRADLE_OPTS 进行设置。

Tip

一些常用的选项是 -Xms-Xmx,它们设置 JVM 的最小和最大堆大小。

The Gradle command-line interface


Gradle,只是 和其他构建工具一样,主要是从命令行运行的。这就是为什么值得花一些时间来熟悉它的 命令行界面的原因。通常,gradle 命令是从项目目录的根目录发出的,其中包含要执行的一些任务。假设我们在 hello-gradle 目录中,该目录当前为空。

Gradle 提供了一个非常简单的命令行界面CLI) ,它采用以下形式:

gradle [options…] [tasks…]

正如我们所见,除了 gradle 命令本身,其他一切都是可选的。 options 调整 Gradle 的执行,而我们稍后将详细介绍的 tasks 是基本的工作单元。选项在所有项目中都是通用的,并且特定于 Gradle,但任务可能会因运行 gradle 命令的项目而异。

有一些任务适用于所有项目。 help 就是这样一项任务:

$ gradle help
:help

Welcome to Gradle 2.9.

To run a build, run gradle <task> ...

To see a list of available tasks, run gradle tasks

To see a list of command-line options, run gradle --help

To see more detail about a task, run gradle help --task <task>

BUILD SUCCESSFUL

Total time: 0.639 secs

Gradle 通过告诉我们如何找到所有可用任务和列出所有命令行选项。让我们首先检查一下我们的项目当前还有哪些其他任务可用。请记住,我们仍然在空目录 hello-gradle 中:

$ gradle tasks
:tasks

------------------------------------------------------------
All tasks runnable from root project
------------------------------------------------------------

Build Setup tasks
-----------------
init - Initializes a new Gradle build. [incubating]
wrapper - Generates Gradle wrapper files. [incubating]

Help tasks
----------
components - Displays the components produced by root project 'hello-gradle'. [incubating]
dependencies - Displays all dependencies declared in root project 'hello-gradle'.
dependencyInsight - Displays the insight into a specific dependency in root project 'hello-gradle'.
help - Displays a help message.
model - Displays the configuration model of root project 'hello-gradle'. [incubating]
projects - Displays the sub-projects of root project 'hello-gradle'.
properties - Displays the properties of root project 'hello-gradle'.
tasks - Displays the tasks runnable from root project 'hello-gradle'.

To see all tasks and more detail, run gradle tasks --all

To see more detail about a task, run gradle help --task <task>

BUILD SUCCESSFUL

Total time: 0.652 secs

这向我们展示了一些可用的通用任务即使我们没有向其中添加任何任务我们的项目。我们可以尝试运行所有这些任务并查看输出。我们将在接下来的章节中详细了解这些任务。

另一个有用的命令 gradle help 建议我们使用 --help 选项检查所有可用的选项。

Tip

help 任务与 --help 选项不同。

当我们运行 gradle --help 命令时,我们得到以下输出:

$ gradle --help

USAGE: gradle [option...] [task...]

-?, -h, --help          Shows this help message.
-a, --no-rebuild        Do not rebuild project dependencies.
-b, --build-file        Specifies the build file.
…..

(为简洁起见,输出被截断。)

该选项具有长形式,例如 --help,并且可能具有短形式,例如 -h。我们之前已经使用过一个选项,即 --version-v,它会打印有关 Gradle 版本的信息。以下是一些常用的选项;还有更多选项,可以使用 gradle --help 命令查看:

选项

描述

-b, --build-file

这指定了一个构建文件(默认:build.gradle

--继续

即使在任务失败后,这也会继续执行任务

-D, --system-prop

这将设置 JVM 的系统属性

-d, --debug

这将打印调试级别日志

--gui

这将启动 Gradle GUI

-i, --info

这将打印信息级别日志

-P, --project-prop

这为项目添加了一个属性

-q, --quiet

这仅记录错误

-s, --stacktrace

这会打印异常的堆栈跟踪

-x, --exclude-task

这不包括特定任务

The first Gradle build script


所以我们现在已经准备好开始行动了,看看我们的第一个Gradle 脚本正在运行。让我们在 hello-gradle 目录中创建一个名为 build.gradle 的文件。除非 使用 --build-file 选项提供构建文件路径,否则 Gradle 会处理当前目录作为项目根并尝试在那里找到 build.gradle 文件。如果我们之前使用过 Ant 或 Maven,我们可以将这个文件分别与 build.xmlpom.xml 相关联。

现在,打开 build.gradle 文件,让我们通过添加以下行来声明一个任务:

task helloWorld

我们应该可以在命令行中看到这个任务,如下所示:

$ gradle tasks
...
Other tasks
-----------
helloWorld
...

在这里,我们成功地创建了一个名为 helloWorld 的任务对象。任务是 Gradle 中的一等对象,这意味着它们具有属性和方法。这在构建的可定制性和可编程性方面为我们提供了极大的灵活性。

然而,这个任务实际上还没有做任何事情。所以让我们为这个任务添加一些有意义的动作:

task helloWorld << {
  println "Hello, World!"
}

现在从 命令行,我们可以通过发出以下命令来执行此任务:

$ gradle -q helloWorld
Hello, World!

请注意,我们使用了 –q 标志来减少输出中的详细程度。运行此任务时,我们会看到任务生成的输出,但 Gradle 没有任何输出,除非它是错误的。

现在,让我们尝试简要了解 build.gradle 文件。第一行声明任务并启动将在最后执行的代码块的主体。左移运算符 (<<) 可能感觉很奇怪,但在这种情况下它非常重要。我们将在后面的章节中看到它的确切含义。第二行是一个 Groovy 语句,它将给定的字符串打印到控制台。此外,第三行结束了代码块。

Tip

Groovy 的 println "Hello, World!" 等价于 Java 中的 System.out.println("Hello, World!") .

Task name abbreviation

从命令行调用 gradle 任务时,我们可以通过仅键入足以唯一标识任务名称的字符来节省一些击键。例如,任务 helloWorld 可以使用 gradle hW 调用。我们也可以使用helloWhWorld,甚至是heWo。但是,如果我们只是调用 gradle h,那么 help 任务就会被调用。

当我们需要经常调用长的 Gradle 任务名称时,这非常方便。例如,一个名为 deployToProductionServer 的任务可以通过调用 gradle dTPS 来调用,前提是这与任何其他任务名称不匹配缩写。

Gradle Daemon

当我们谈论频繁调用 Gradle 时,现在是了解提高构建性能的推荐技术的好时机。 Gradle Daemon 是一个在后台持续运行的进程,可以显着加快构建速度。

对于给定的 gradle 命令调用,我们可以指定 --daemon 标志来启用守护进程。但是,我们应该记住,当我们启动守护进程时,只有后续的构建会更快,而不是当前的构建。例如:

$ gradle helloWorld --daemon
Starting a new Gradle Daemon for this build (subsequent builds will be faster).
:helloWorld
Hello, World!

BUILD SUCCESSFUL

Total time: 2.899 secs


$ gradle helloWorld
:helloWorld
Hello, World!

BUILD SUCCESSFUL

Total time: 0.6 secs

在前面的示例中,如果我们注意到两次运行所花费的时间,第二次运行的完成速度要快得多,这要归功于 Gradle 守护进程。

我们还可以通过传递 --no-daemon 标志来阻止特定的构建调用使用守护进程。

有多种方法可以启用或禁用 Gradle Daemon,这些方法记录在 https ://docs.gradle.org/current/userguide/gradle_daemon.html

Gradle Wrapper

Gradle Wrapper 包含一个适用于 Linux/Mac OS X 的 gradlew shell 脚本、一个适用于 Windows 的 gradlew.bat 批处理脚本,以及一些帮助文件。这些文件可以通过运行 gradle wrapper 任务生成,并且应该与项目源代码一起检入版本控制系统 (VCS)。我们可以通过包装脚本运行构建,而不是使用系统范围的 gradle 命令。

通过包装脚本运行构建的一些优点如下:

  1. 我们不需要手动下载和安装 Gradle。包装脚本会处理这个问题。

  2. 它使用项目需要的特定版本的 Gradle。这降低了由于不兼容的 Gradle 版本而破坏项目构建的风险。我们可以安全地升级(或降级)系统范围的 Gradle 安装,而不会影响我们的项目。

  3. 它透明地在团队中所有开发人员的机器上为我们的项目强制执行相同的 Gradle 版本。

  4. 这在持续集成构建环境中非常有用,因为我们不需要在服务器上安装/更新 Gradle。

Generating wrapper files

Gradle wrapper 任务已经可用于所有 Gradle 项目。要生成包装脚本和支持文件,只需从命令行执行以下代码:

$ gradle wrapper 

在生成 wrapper 时,我们可以指定确切的 Gradle 版本,如下所示:

$ gradle wrapper --gradle-version 2.9

在此示例中,我们指定要使用的 Gradle 版本为 2.9。运行此命令后,我们应该将生成的文件签入 VCS。我们可以自定义 wrapper 任务以使用配置的 Gradle 版本、生成不同名称的包装脚本、更改它们的位置等等。

Running a build via wrapper

为了利用包装脚本的好处,我们需要根据我们的操作系统调用包装脚本,而不是使用 gradle 命令。

在 Mac OS X/Linux 上:

$ ./gradlew taskName

在 Windows 上:

$ gradlew taskName

我们可以完全按照传递给 gradle 命令的方式使用参数和标志。

Summary


在本章中,我们首先简要介绍了 Gradle。然后,我们查看了手动安装以及通过包管理器进行的安装。我们还了解了 Gradle 的命令行界面。此外,最后,我们编写了第一个 Gradle 构建脚本。

如果您一直按照本章进行操作,那么您已经准备好在您的机器上检查任何基于 Gradle 的项目并执行构建。此外,您还具备编写非常基本的 Gradle 构建脚本的知识。展望未来,我们将着眼于使用 Gradle 构建基于 Java 的项目。