一、闭包委托

  • 闭包有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 公布!