关于android:Gradle连载1闭包

34次阅读

共计 2816 个字符,预计需要花费 8 分钟才能阅读完成。

一、闭包委托

  • 闭包有 thisObject、owner、delegate 三个属性,在闭包内调用办法的时候,由他们来确定应用哪个对象呢来进行解决。默认状况下 delegate 和 owner 是相等的,过后 delegate 是能够被批改的,这个性能是十分弱小的,Gradle 中的闭包很多性能都是通过批改 delegate 进行实现的。

    task helloDelegate {new Delegate().test {println "thisObject:${thisObject.getClass()}"
          println "owner:${owner.getClass()}"
          println "delegate:${delegate.getClass()}"
          println "================"
          method1()
          println "================"
          it.method1()}
    }
    
    def method1() {println "Context this:${this.getClass() } int root"
      println "method1 in Delegate"
    }
    
    class Delegate {def method1() {println "Delegate this:${this.getClass() } int Delegate"
          println "method1 in Delegate"
      }
    
      def test(Closure<Delegate> closure) {closure(this)
      }
    }

task configClosure {
    person {
        personName = "张三"
        personAge = 20
        dumpPerson()}
}

class Person {
    String personName
    int personAge

    def dumpPerson() {println "name is ${personName}, age is ${personAge}"
    }
}

def person(Closure<Person> closure) {Person p = new Person();
    closure.delegate = p
    // 委托模式优先
    closure.setResolveStrategy(Closure.DELEGATE_FIRST);
    closure(p)
}

二、task,doFirst,doLast

task customTask1 {
    doFirst {println 'customTask1:doFirst'}
    doLast {println 'customTask1:doLast'}
}

tasks.create("customTask2") {
    doFirst {println 'customTask2:doFirst'}
    doLast {println 'customTask2:doLast'}
}
  • 这两种形式都是能够的,task 是 Project 对象的一个函数,原型为 create(String name, Closure configureClosure)
  • customTask1 为工作的名字,咱们能够自定义;第二个参数是一个闭包,也就是咱们花括号外面的代码块,依据咱们讲的 Groovy 的只是,最初一个参数是闭包的时候,也能够放到括号里面,而后办法的括号是能够进行省略的,就能够生成了咱们下面的写法,很简洁。该闭包作用就是用来对咱们创立的工作进行配置,例子中咱们用了工作的 doFirst 和 doLast 办法,别离在工作执行前后输入了一段文字,除此之外还有其余办法,属性等。

    三、工作依赖

    task ex35Hello {println 'hello'}
    
    task ex35Main(dependsOn: ex35Hello) {
      doLast {println 'main'}
    }
    

  • 从下面能够看进去工作 ex35Main 是依赖第一个工作,咱们在这外面写入了 dependsOn 关键字,进行增加前置工作,上面来看一下,减少一下多个工作

    task ex35Hello {println 'hello'}
    
    task ex35Main(dependsOn: ex35Hello) {
      doLast {println 'main'}
    }
    
    task ex35World {println 'world'}
    
    task ex35MultiTask {
      dependsOn ex35Hello, ex35World
      doLast {println 'multiTask'}
    }

    四、工作键通过 API 管制、交互

    task ex36Hello {println 'dowLast1'}
    
    ex36Hello.doFirst {println 'dowFirst'}
    
    ex35Hello.doLast {println project.hasProperty('ex36Hello') // 阐明每一个工作都是 Project 的一个属性
      println 'dowLast2'
    }
  • 在 Project 中每一个 task 都是一个属性,咱们从下面返回的断定后果中就可见一斑。

    五、自定义属性

    // 自定义一个 Project 的属性
    ext.age = 18
    
    // 通过代码块同时自定义多个属性
    ext {
      phone = 1334512
      address = ''
    }
    
    sourceSets.all {ext.resourcesDir = null}
    
    sourceSets {
      main {resourcesDir = "main/res"}
    
      test {resourcesDir = "test/res"}
    }
    
    task ex37CustomProperty {println "年龄是:${age}"
      println "电话是:${phone}"
      println "地址是:${address}"
    
      sourceSets.each {println "${it.name} 的 resourcesDir 是:${it.resourcesDir}"
      }
    }

  • 自定义的属性都失效了,在我的项目中个别应用它来自定义版本号和版本名称,把版本号和版本名称独自放在一个 Gradle 文件中,因为他们每次公布版本的时候都会扭转,变动频繁,放到一个独自的 Gradle 文件中,便于管理,而且改变的时候不会因为 Git 抵触影响整个 Build 文件,便于解决抵触。

    六、脚本代码

    def buildTime() {def date = new Date()
      def formattedDate = date.format("yyyyMMdd")
      return formattedDate
    }
  • 在 build.gradle 文件中能够应用 Java 代码,Groovy 代码和 Gradle,灵便应用这些代码,能够使工程更能智能,多样化。

    七、源码

  • gitee 门路:https://gitee.com/dongqianrui…
  • CSDN:https://blog.csdn.net/weixin_…
  • 博客园:https://www.cnblogs.com/ruige…
  • 欢送关注微信公众号:傅里叶变换,集体账号,仅用于技术交换

本文由博客一文多发平台 OpenWrite 公布!

正文完
 0