读书笔记《gradle-essentials》运行您的第一个Gradle任务
我们正在快速学习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 为其构建提供支持。
在我们继续运行 Gradle 之前,我们必须在我们的机器上安装它。可以通过多种方式安装和更新 Gradle。我们将首先看到一种更手动的方式来安装 Gradle,然后通过一些常用的包管理器快速了解如何安装它。我们可以选择任何一种符合要求的方法。无论我们安装 Gradle 的方式如何,我们都必须满足以下先决条件。
Gradle 需要 Java 运行时环境 ( JRE) 6 或 Java 开发工具包 (JDK) 1.6 或更高版本。没有其他依赖。我们建议安装 JDK。为了验证这一点,在命令行中,我们可以使用以下命令检查 Java 版本:
如果我们没有看到或多或少像前面命令中显示的输出,则说明我们的 JDK 安装有问题。
如果我们想要更好地控制安装,那么这是一条合适的路线。当我们无法使用包管理器,想要下载和安装非常特定的二进制文件时,或者在不允许包管理器自动下载的公司防火墙后面时,可能就是这种情况。我们需要下载 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 命令在命令行上可用。这部分取决于我们使用的操作系统。
假设 我们将下载的 zip 解压缩为 ~/gradle-2.9/
。现在,我们只需在 .bashrc
/、.bash_profile
/ 或 / 的末尾添加以下两行class="literal">.zshrc
,取决于我们使用的操作系统和外壳:
假设我们 将 zip 解压缩为 C:\gradle-2.9
,然后执行以下步骤:
打开开始菜单,右键单击计算机并选择属性 .
在 高级系统设置 上,选择 高级 标签,然后选择 环境变量...。
创建一个
GRADLE_HOME
环境变量,其值为C:\gradle-2.9
。Tip
下载示例代码
您可以从您的帐户下载示例代码文件,网址为 http://www.packtpub.com对于您购买的所有 Packt Publishing 书籍。如果您在其他地方购买了这本书,您可以访问 http://www.packtpub.com/support< /a> 并注册以将文件直接通过电子邮件发送给您。
编辑(或添加,如果还没有的话)
PATH
环境变量。在其值的末尾,附加;%GRADLE_HOME%\bin
(如果存在多个路径条目,则添加分号)。
虽然手动安装可以完全控制安装过程,但各种任务,例如下载和解压正确版本、升级到最新版本、卸载和编辑环境变量很快变得繁琐且容易出错。这就是为什么许多人更喜欢包管理器来控制整个过程。
虽然 手动安装(如上一节所述)非常容易,但我们可以使用包管理器使其超级简单。
一些 Linux 发行版(例如 Ubuntu)附带了它们的包管理器、Mac OS X、Windows 默认没有安装任何包管理器。但是,幸运的是,这两个平台都有多个包管理器可用。我们将看到 Mac 上的 Homebrew 和 Windows 上的 Chocolatey 的示例。
SDKMAN 代表 软件开发工具包管理器。用它自己的话来说,该网站将其描述为:SDKMAN!是用于在大多数基于 Unix 的系统上管理多个软件开发工具包的并行版本的工具。
SDKMAN 相对于其他包管理器的优势在于我们可以在系统上安装多个 Gradle 版本,并为给定项目选择不同的版本。如果我们安装了它,我们需要做的就是运行以下命令:
SDKMAN 可以从 http://sdkman.io/ 安装。
在 中,无论我们选择哪种方式安装 Gradle,在我们继续之前验证它是否正常工作是个好主意。我们可以通过简单地在命令行上检查 Gradle 的版本来做到这一点:
如果我们看到与上面类似的输出,我们的机器上已经正确安装了 Gradle。
Gradle,只是 和其他构建工具一样,主要是从命令行运行的。这就是为什么值得花一些时间来熟悉它的 命令行界面的原因。通常,gradle
命令是从项目目录的根目录发出的,其中包含要执行的一些任务。假设我们在 hello-gradle
目录中,该目录当前为空。
Gradle 提供了一个非常简单的命令行界面(CLI) ,它采用以下形式:
正如我们所见,除了 gradle
命令本身,其他一切都是可选的。 options
调整 Gradle 的执行,而我们稍后将详细介绍的 tasks
是基本的工作单元。选项在所有项目中都是通用的,并且特定于 Gradle,但任务可能会因运行 gradle
命令的项目而异。
有一些任务适用于所有项目。 help
就是这样一项任务:
Gradle 通过告诉我们如何找到所有可用任务和列出所有命令行选项。让我们首先检查一下我们的项目当前还有哪些其他任务可用。请记住,我们仍然在空目录 hello-gradle
中:
这向我们展示了一些可用的通用任务即使我们没有向其中添加任何任务我们的项目。我们可以尝试运行所有这些任务并查看输出。我们将在接下来的章节中详细了解这些任务。
另一个有用的命令 gradle help
建议我们使用 --help
选项检查所有可用的选项。
当我们运行 gradle --help
命令时,我们得到以下输出:
(为简洁起见,输出被截断。)
该选项具有长形式,例如 --help
,并且可能具有短形式,例如 -h
。我们之前已经使用过一个选项,即 --version
或 -v
,它会打印有关 Gradle 版本的信息。以下是一些常用的选项;还有更多选项,可以使用 gradle --help
命令查看:
选项 |
描述 |
---|---|
|
这指定了一个构建文件(默认: |
|
即使在任务失败后,这也会继续执行任务 |
|
这将设置 JVM 的系统属性 |
|
这将打印调试级别日志 |
|
这将启动 Gradle GUI |
|
这将打印信息级别日志 |
|
这为项目添加了一个属性 |
|
这仅记录错误 |
|
这会打印异常的堆栈跟踪 |
|
这不包括特定任务 |
所以我们现在已经准备好开始行动了,看看我们的第一个Gradle 脚本正在运行。让我们在 hello-gradle
目录中创建一个名为 build.gradle
的文件。除非 使用 --build-file
选项提供构建文件路径,否则 Gradle 会处理当前目录作为项目根并尝试在那里找到 build.gradle
文件。如果我们之前使用过 Ant 或 Maven,我们可以将这个文件分别与 build.xml
或 pom.xml
相关联。
现在,打开 build.gradle
文件,让我们通过添加以下行来声明一个任务:
我们应该可以在命令行中看到这个任务,如下所示:
在这里,我们成功地创建了一个名为 helloWorld
的任务对象。任务是 Gradle 中的一等对象,这意味着它们具有属性和方法。这在构建的可定制性和可编程性方面为我们提供了极大的灵活性。
然而,这个任务实际上还没有做任何事情。所以让我们为这个任务添加一些有意义的动作:
请注意,我们使用了 –q
标志来减少输出中的详细程度。运行此任务时,我们会看到任务生成的输出,但 Gradle 没有任何输出,除非它是错误的。
现在,让我们尝试简要了解 build.gradle
文件。第一行声明任务并启动将在最后执行的代码块的主体。左移运算符 (<<
) 可能感觉很奇怪,但在这种情况下它非常重要。我们将在后面的章节中看到它的确切含义。第二行是一个 Groovy 语句,它将给定的字符串打印到控制台。此外,第三行结束了代码块。
从命令行调用 gradle 任务时,我们可以通过仅键入足以唯一标识任务名称的字符来节省一些击键。例如,任务 helloWorld
可以使用 gradle hW
调用。我们也可以使用helloW
、hWorld
,甚至是heWo
。但是,如果我们只是调用 gradle h
,那么 help
任务就会被调用。
当我们需要经常调用长的 Gradle 任务名称时,这非常方便。例如,一个名为 deployToProductionServer
的任务可以通过调用 gradle dTPS
来调用,前提是这与任何其他任务名称不匹配缩写。
当我们谈论频繁调用 Gradle 时,现在是了解提高构建性能的推荐技术的好时机。 Gradle Daemon 是一个在后台持续运行的进程,可以显着加快构建速度。
对于给定的 gradle 命令调用,我们可以指定 --daemon
标志来启用守护进程。但是,我们应该记住,当我们启动守护进程时,只有后续的构建会更快,而不是当前的构建。例如:
在前面的示例中,如果我们注意到两次运行所花费的时间,第二次运行的完成速度要快得多,这要归功于 Gradle 守护进程。
我们还可以通过传递 --no-daemon
标志来阻止特定的构建调用使用守护进程。
有多种方法可以启用或禁用 Gradle Daemon,这些方法记录在 https ://docs.gradle.org/current/userguide/gradle_daemon.html
Gradle Wrapper 包含一个适用于 Linux/Mac OS X 的 gradlew
shell 脚本、一个适用于 Windows 的 gradlew.bat
批处理脚本,以及一些帮助文件。这些文件可以通过运行 gradle wrapper
任务生成,并且应该与项目源代码一起检入版本控制系统 (VCS)。我们可以通过包装脚本运行构建,而不是使用系统范围的 gradle
命令。
通过包装脚本运行构建的一些优点如下:
我们不需要手动下载和安装 Gradle。包装脚本会处理这个问题。
它使用项目需要的特定版本的 Gradle。这降低了由于不兼容的 Gradle 版本而破坏项目构建的风险。我们可以安全地升级(或降级)系统范围的 Gradle 安装,而不会影响我们的项目。
它透明地在团队中所有开发人员的机器上为我们的项目强制执行相同的 Gradle 版本。
这在持续集成构建环境中非常有用,因为我们不需要在服务器上安装/更新 Gradle。
Gradle wrapper
任务已经可用于所有 Gradle 项目。要生成包装脚本和支持文件,只需从命令行执行以下代码:
在生成 wrapper
时,我们可以指定确切的 Gradle 版本,如下所示:
在此示例中,我们指定要使用的 Gradle 版本为 2.9。运行此命令后,我们应该将生成的文件签入 VCS。我们可以自定义 wrapper
任务以使用配置的 Gradle 版本、生成不同名称的包装脚本、更改它们的位置等等。