写了几个Gradle插件后,好像对Gradle还是挺云里雾里的。虽然知道很多时候该怎么做,但是对于很多细节还挺懵的。由此打算写一些Gradle基础的东西,帮助巩固和加深下Gradle知识。
说到Gradle就逃不过Groovy,对于Groovy重点关注一些特点就好,其余的用Java的知识对付对付就可以了(其实是我不太懂,嘿嘿)。即使是在有了Kotlin DSL支持的Gradle,先通过Groovy也能帮助加深了解。
1.理解Groovy的方法调用
先从简单的看起,在Groovy里创建一个对象,并且调用这个对象的方法:
class Test{
void test(){
println('test')
}
}
def test = new Test()
test.test()
很简单,和Java差别在于new对象的时候 Test test = new Test()
而Groovy使用了def
关键字。接下来,Groovy还支持奇怪的调用方式:
test.invokeMethod('test',null)
嗯?这个怎么看起来有点像Java的反射?这样在Groovy里面也是可以的。接下来我们在上面这个Test
类中添加一些方法:
class Test{
void test(){
println('test')
}
void test1(String content){//新增,打印传入的内容
println(content)
}
void test2(){//新增,调用test1方法
test1('From test2')
}
}
新增两个方法,那么在外面接着调用test2()
方法,console里面输出"From test2"
,这也符合预期。Groovy支持在不引起歧义的情况下去除方法调用的括号,那么可以改一改上面的类中的方法:
class Test {
void test() {
println('test')
}
void test1(String content) {
println(content)
}
void test2() {
test1 'From test2'//注意和上面的对比,少了括号
}
}
运行一下,console里面也可以正常输出。有没有觉得有点眼熟?这个test1 "From test2"
像不像在gradle里面的一些配置?
看到
include ':app'
吗?有没有觉得很像啊,其实就是这么回事儿。那么这个include
方法是哪里来的呢?如果你点进去这个方法,发现会跳转到一个Settings
的class中,在这里可以看到。
2.理解Groovy的闭包
Groovy可以直接将方法当成一个对象来调用:
def closure = {
println('closure')
}
closure()
那这个def closure
是什么类型的对象呢?Groovy里面定义了Closure
类,用于表示这样的对象。将上面提到的Test
对象改一改:
class Test {
void test(Closure closure) {//注意,新增了传参closure
println('test')
closure()
}
void test1(String content) {
println(content)
}
void test2() {
test1 'From test2'
}
void test3(){
def closure = {
println("Closure")
}
test(closure)//调用test(Closure closure)方法
}
}
现在调用test()
方法就需要传入一个Closure
对象:
def closure = {
println("Closure")
}
test(closure)
其实并不是一定需要closure
对象的,那么就可以改成这样:
test({
println("Closure")
})
看起来也很OK,还记得前面说到的,Groovy可以在不引起歧义的情况下去除方法调用的括号吗?接下来可以改成这样:
test {//去除了tes()的括号
println "Closure"//去除了println()的括号
}
这下有没有觉得有点眼熟啊?看看gradle中常用的引入依赖的代码呢:
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.core:core-ktx:1.3.2'
implementation 'androidx.appcompat:appcompat:1.2.0'
}
是不是一摸一样。这个dependencies
方法则是在Project
这个class中提供的。
OK,这里就是平时使用Gradle中比较多的,也是个人之前比较困惑的地方。接下来会提供关于Gradle 更多理解的文章。
网友评论