Gradle基础

写了几个Gradle插件后,好像对Gradle还是挺云里雾里的。虽然知道很多时候该怎么做,但是对于很多细节还挺懵的。由此打算写一些Gradle基础的东西,帮助巩固和加深下Gradle知识。

本系列共包括三篇文章:
Gradle基础:https://www.jianshu.com/p/e4e038345778
Gradle基本流程:https://www.jianshu.com/p/6feb6222a1d0
Gradle插件编写:https://www.jianshu.com/p/2135ed194a1b

说到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里面的一些配置?

image.png

看到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 更多理解的文章。

你可能感兴趣的:(Gradle基础)