迄今为止,我们已经学些了众多 gradle 构建的概念以及如何运行 tasks。在这一章,我们将对这些概念有一个更深的理解,然后开始构建我们自己的 tasks。一旦我们掌握了如何编写自定义 tasks,那么我们就可以试着编写自己的插件,以达到在多个项目中复用的目的。
在我们创建传统 tasks 之前,我们有必要了解些 Groovy 的基本语法。因为这理解 Groovy 如何运行会使得我们能更好的理解 tasks 和插件。理解 Groovy 同样帮助我们理解 Gradle 如何工作,以及为什么这些配置文件需要这样配置。
在这一章,我们将会遵循以下主题:
理解 Groovy
重新认识 tasks
Hooking Android 插件
编写自定义插件
大部分 Android 开发者也是名 Java 开发者,和 Java 对比,Groovy 也是运行在 JVM上。当然,如果你是名 Java 开发者,那么 Groovy 将会变得容易阅读,但是在编写你自己的 Groovy 代码之前,你必须对 Groovy 有一个全面的了解。
Groovy 起源于 Java,其运行在 JVM 上。其目标是创造更简单,更直接的语言,不仅仅在脚本语言上或者编译语言上运行。通过这一章节,我们将对 Groovy 和 Java 进行对比。
在 Java 中,打印一条 String 应该是这样的:
System.out.println("Hello, world!");
在 Groovy 中,你可以这么写:
println 'Hello, world!'
你应该主要到几点不同之处:
没有了 System.out
没有了方括号
列结尾没有了;
这个例子同样使用了单引号,你可以使用双引号或者单引号,但是他们有不同的用法。双引号可以包含插入语句。插入是计算一个字符串包含 placeholders 的过程,并将 placeholders 的值替换,这些 placeholder 可以是变量甚至是方法。Placeholders 必须包含一个方法或者变量,并且其被{}包围,且其前面有$修饰。如果其只有一个单一的变量,可以只需要 $。下面是一些基本的用法:
def name = 'Andy'
def greeting = "Hello, $name!"
def name_size "Your name is ${name.size()} characters long."
greeting应该是“ Hello,Andy”,并且 name_size 为 Your name is 4 characters long.string的插入可以让你更好的动态执行代码。比如
def method = 'toString'
new Date()."$method"()
这在Java中看起来很奇怪,但是这在groovy里是合法的。
Groovy 里面创建类和 Java 类似,举个例子:
class MyGroovyClass {
String greeting
String getGreeting() {
return 'Hello!'
}
}
注意到不论是类名还是成员变量都没有修饰符。其默认的修饰符是类和方法为 public,成员变量为 private。
当你想使用 MyGroovyClass,你可以这样实例化:
def instance = new MyGroovyClass()
instance.setGreeting 'Hello, Groovy!'
instance.getGreeting()
你可以利用 def 去创建变量,一旦你为你的类创建了实例,你就可以操作其成员变量了。 get/set 方法 groovy 默认为你添加 。你甚至可以覆写它。
如果你想直接使用一个成员变量,你可以这么干:
println instance.getGreeting()
println instance.greeting
而这二种方式都是可行的。
和变量一样,你不必定义为你的方法定义返回类型。举个例子,先看 java:
public int square(int num) {
return num * num;
}
square(2);
你需要将该方法定义为 public,需要定义返回类型,以及入参,最后你需要返回值。
我们再看下 Groovy 的写法:
def square(def num) {
num * num
}
square 4
```
没有了返回类型,没有了入参的定义。def 代替了修饰符,方法体内没有了 return 关键字。然而我还是建议你使用 return 关键字。当你调用该方法时,你不需要括号和分号。
我们设置可以写的更简单点:
```groovy
def square = { num ->
num * num
}
square 8
闭包是一段匿名的方法体,其可以接受参数和返回值。它们可以定义变量或者可以将参数传给方法。
你可以简单的使用方括号来定义闭包,如果你想详细点,你也可以这么定义:
Closure square = {
it * it
}
square 16
添加了 Closure,让其更加清晰。注意,当你没有显式的为闭包添加一个参数,groovy 会默认为你添加一个叫做 it。你可以在所有的闭包中使用 it,如果调用者没有定义任何参数,那么 it 将会是 null,这会使得你的代码更加简洁。
在 grade 中,我们经常使用闭包,例如 Android 代码体和 dependencies 也是。
在 groovy 中,有二个重要的容器分别是 lists 和 maps。
创建一个 list 很容易,我们不必初始化:
List list = [1, 2, 3, 4, 5]
为list迭代也很简单,你可以使用 each 方法:
list.each() { element ->
println element
}
你甚至可以使得你的代码更加简洁,使用 it:
list.each() {
println it
}
map 和 list 差不多:
Map pizzaPrices = [margherita:10, pepperoni:12]
如果你想取出 map 中的元素,可以使用 get 方法:
pizzaPrices.get('pepperoni')
pizzaPrices['pepperoni']
同样的 groovy 有更简单的方式:
pizzaPrices.pepperoni
是不是简单到爆,瞬间感觉Java太复杂的有木有。下一章我们将学习 Groovy 在 Gradle 中的使用情况,相信你会喜欢!