Gradle连载1-闭包

一、闭包委托

  • 闭包有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)
}

}

![在这里插入图片描述](https://img-blog.csdnimg.cn/286599bf52e146c592c8f475a2472230.png)


```groovy
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)
}

1.2

二、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' } }

![1.3](https://img-blog.csdnimg.cn/d672374616ba4f09bbd06e346a3a096b.png)
- 从上面可以看出来任务ex35Main是依赖第一个任务,我们在这里面写入了dependsOn关键字,进行添加前置任务,下面来看一下,增加一下多个任务
```groovy
task ex35Hello {
    println 'hello'
}

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

task ex35World {
    println 'world'
}

task ex35MultiTask {
    dependsOn ex35Hello, ex35World
    doLast {
        println 'multiTask'
    }
}

1.4

四、任务键通过API控制、交互

task ex36Hello {
    println 'dowLast1'
}

ex36Hello.doFirst {
    println 'dowFirst'
}

ex35Hello.doLast {
    println project.hasProperty('ex36Hello') // 说明每一个任务都是Project的一个属性
    println 'dowLast2'
}
  • 在Project中每一个task都是一个属性,我们从上面返回的判定结果中就可见一斑。 1.5

    五、自定义属性

    // 自定义一个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}"
}

}

![1.6](https://img-blog.csdnimg.cn/1b03a418fe7b472c9e625f1c2ed7014c.png)
- 自定义的属性都生效了,在项目中一般使用它来自定义版本号和版本名称,把版本号和版本名称单独放在一个Gradle文件中,因为他们每次发布版本的时候都会改变,变动频繁,放到一个单独的Gradle文件中,便于管理,而且改动的时候不会因为Git冲突影响整个Build文件,便于解决冲突。
## 六、脚本代码
```groovy
def buildTime() {
    def date = new Date()
    def formattedDate = date.format("yyyyMMdd")
    return formattedDate
}

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值