美文网首页
Gradle基础

Gradle基础

作者: From64KB | 来源:发表于2020-11-19 11:44 被阅读0次

    写了几个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里面的一些配置?

    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基础

          本文链接:https://www.haomeiwen.com/subject/eeskiktx.html