Groovy
概述
Groovy(音[ˈɡruːvi])是一种基于JVM平台的动态面向对象语言。简单说,可以把它理解为用Java开发的,运行在JVM上的脚本语言。它在语法上完全兼容Java,且参考了Python、Ruby等语言,语法总是给人熟悉的感觉,非常容易上手。 Groovy 1.0于2007年1月2日发布。官网为 http://www.groovy-lang.org/
特点
Groovy中有以下特点
同时支持静态和动态类型。
支持运算符重载。
对正则表达式的本地支持。
各种标记语言,如XML和HTML原生支持。
对于Java开发人员来说非常简单,两者的语法非常相似
可以直接使用现有的Java库
Gradle
概述 Gradle是一个开源的基于Groovy的自动化构建工具,它的设计足够灵活,几乎可以构建任何类型的软件。以下是对其一些最重要的功能的高级概述。
高性能 Gradle通过只运行那些因为输入或输出发生变化而需要运行的任务来避免不必要的工作。你也可以使用构建缓存来实现重用之前运行的任务输出,甚至从不同的机器上重用(使用共享构建缓存)。
JVM基础 Gradle运行在JVM上,你必须安装一个Java开发工具包(JDK)才能使用它。这对于熟悉Java平台的用户来说是一个额外的好处,因为你可以在你的构建逻辑中使用标准的Java APIs,比如自定义任务类型和插件。这也使得在不同的平台上运行Gradle变得容易。 需要注意的是,Gradle并不局限于只构建JVM项目,它甚至还打包了对构建本地项目的支持。
约定 Gradle借鉴了Maven的经验,通过实现约定,让常见类型的项目--比如Java项目--变得容易构建。应用适当的插件,你可以很容易地最终为许多项目提供纤细的构建脚本。但这些约定并不会限制你。Gradle允许你覆盖它们,添加你自己的任务,并对你的基于约定的构建进行许多其他的自定义。
扩展性 你可以随时扩展Gradle来提供自己的任务类型甚至构建模型。请看Android构建支持的例子:它增加了许多新的构建概念,如flavors和构建类型。
IDE支持 几个主要的IDE允许你导入Gradle构建并与之交互。Android Studio、IntelliJ IDEA、Eclipse和NetBeans。Gradle还支持生成将项目加载到Visual Studio所需的解决方案文件。
洞察力 构建扫描提供了有关构建运行的广泛信息,可以使用这些信息来识别构建问题。它们尤其能帮助您识别构建的性能问题。你也可以与他人分享构建扫描,如果你需要在修复构建问题时寻求建议,这特别有用。
关于Gradle,你需要知道的五件事
Gradle是一个灵活而强大的构建工具,当你刚开始使用时,很容易感到恐惧。然而,了解以下核心原则会让Gradle变得更加平易近人,你会在知道它之前就熟练地使用这个工具。
Gradle是一个通用的构建工具 Gradle允许你构建任何软件,因为它对你要构建的东西或应该如何构建几乎不做假设。最显著的限制是,依赖管理目前只支持Maven和Ivy兼容的仓库和文件系统。
这并不意味着你必须做很多工作来创建一个构建。Gradle通过添加一层约定和通过插件预构建功能,使得构建常见类型的项目(例如Java库)变得很容易。你甚至可以创建和发布自定义插件来封装自己的约定和构建功能。
核心模型是基于任务的 Gradle将其构建模型作为任务(工作单元)的定向无环图(DAGs)。这意味着,一个构建基本上配置了一组任务,并将它们连接在一起,基于它们的依赖性以创建该DAG。一旦任务图被创建,Gradle就会确定哪些任务需要以何种顺序运行,然后继续执行它们。
这张图显示了两个任务图的例子,一个是抽象的,另一个是具体的,任务之间的依赖关系用箭头表示。

几乎所有的构建过程都可以通过这种方式建模为一个任务图,这也是Gradle如此灵活的原因之一。而这个任务图既可以由插件定义,也可以由你自己的构建脚本定义,任务通过任务依赖机制连接在一起。
任务本身包括:
- Actions :做某件事,比如复制文件或编译源代码
- Inputs :做某事或执行某操作的值、文件和目录
- Outputs :做某事而修改或生成的文件和目录
实际上,以上所有内容都是可选的,这取决于任务需要做什么。 有些任务(例如标准生命周期任务)甚至没有任何动作。 他们只是为了方便而将多个任务汇总在一起。
你可以选择要运行的任务。通过指定做你需要的任务来节省时间,但仅此而已。如果你只是想运行单元测试,就选择执行该任务的任务--通常是
test。如果你想打包一个应用程序,大多数构建都有一个assemble任务。
最后一件事:Gradle的增量构建支持是强大而可靠的,所以通过避免使用clean任务来保持你的构建运行速度,除非你真的想执行clean任务
Gradle有几个固定的构建阶段 重要的是要了解Gradle分三个阶段运行和执行构建脚本:
Initialization 设置构建的环境,并确定哪些项目将参与其中。
Configuration 构建和配置构建的任务图,然后根据用户想要运行的任务,确定需要运行的任务和顺序。
Execution 运行在配置阶段结束时选择的任务。首先执行
doFirst {}闭包中的内容,最后执行doLast {}闭包中的内容这些阶段构成了Gradle的构建生命周期。
设计良好的构建脚本主要由声明式配置而不是命令式逻辑组成。可以理解的是,这些配置在配置阶段就会被运行。即便如此,许多这样的构建也有任务动作,例如通过
doLast {}和doFirst {}块在执行阶段进行评估。这一点很重要,因为在配置阶段评估的代码不会看到执行阶段发生的变化。配置阶段的另一个重要方面是,每次构建运行时都会对其中涉及的所有内容进行评估。这就是为什么在配置阶段避免昂贵的工作是最好的做法。构建扫描可以帮助你识别这样的热点,其中包括
Gradle的扩展方式不止一种 如果你能只使用Gradle捆绑的构建逻辑来构建你的项目,那就太好了,但这几乎是不可能的。 大多数构建都有一些特殊要求,这意味着需要添加自定义构建逻辑。
Gradle提供了几种机制,让你可以对它进行扩展,比如:
自定义任务类型 当你想让build做一些现有任务不能做的工作时,你可以简单地编写自己的任务类型。一般来说,最好把自定义任务类型的源文件放在buildSrc目录下或打包的插件中。然后你就可以像使用任何一个Gradle提供的任务类型一样,使用这个自定义任务类型。
自定义任务action 你可以通过Task.doFirst()和Task.doLast()方法在任务之前或之后附加执行的自定义构建逻辑。
项目和任务的额外属性 这些允许您将自己的属性添加到项目或任务中,然后您可以从自己的自定义动作或任何其他构建逻辑中使用这些属性。额外的属性甚至可以应用于那些不是由你明确创建的任务,比如那些由Gradle的核心插件创建的任务。
自定义约定 约定是简化构建的强大方式,这样用户可以更容易理解和使用它们。使用标准项目结构和命名约定的构建(例如Java构建)可以看出这一点。你可以编写自己的插件,提供约定,它们只需要为构建的相关方面配置默认值。
自定义的模型 Gradle允许你在任务,文件和依赖项配置之外将新概念引入构建。你可以在大多数语言插件中看到这一点,它将源集的概念添加到构建中。对构建过程进行适当的建模,可以极大地提高构建的易用性和效率。
构建脚本对API进行操作 很容易将Gradle的构建脚本视为可执行代码,因为它们就是这样的。但这只是一个实现细节:精心设计的构建脚本描述了构建软件所需的步骤,而不是这些步骤应该如何工作。那是自定义任务类型和插件的工作。
有一个普遍的误解,认为Gradle的强大和灵活性来自于它的构建脚本是代码,这离事实还远。是底层模型和API提供了力量。正如我们在最佳实践中所建议的那样,你应该避免在构建脚本中放置太多(如果有的话)命令式逻辑。
然而,有一个领域将构建脚本视为可执行代码是很有用的:
了解构建脚本的语法如何映射到Gradle的API。 由Groovy DSL参考和Javadocs组成的API文档列出了方法和属性,并引用了闭包和操作。 这些在构建脚本的上下文中是什么意思? 查看Groovy构建脚本入门,了解这个问题的答案,以便能够有效地使用API文档。
由于Gradle运行在JVM上,构建脚本也可以使用标准的Java API。Groovy构建脚本可以额外使用Groovy API,而Kotlin构建脚本可以使用Kotlin的。
注意,以上列举的三个参考文档在国内无法打开或打开缓慢,可直接查看本地离线文档,查看路径如下:
- Groovy DSL参考:
docs/dsl/index.html - Javadocs:
/docs/javadoc/index.html - Groovy构建脚本入门:
/docs/userguide/groovy_build_script_primer.html
公众号“编程之路从0到1”
