Gradle连载2-多种方式创建任务

一、闭包委托

  • 闭包有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 closure) { closure(this) } }

    Gradle连载2-多种方式创建任务
    文章图片

task configClosure { person { personName = "张三" personAge = 20 dumpPerson() } }class Person { String personName int personAgedef dumpPerson() { println "name is ${personName}, age is ${personAge}" } }def person(Closure closure) { Person p = new Person(); closure.delegate = p // 委托模式优先 closure.setResolveStrategy(Closure.DELEGATE_FIRST); closure(p) }

Gradle连载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' } }

    Gradle连载2-多种方式创建任务
    文章图片

  • 从上面可以看出来任务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' } }

    Gradle连载2-多种方式创建任务
    文章图片

    四、任务键通过API控制、交互
    task ex36Hello { println 'dowLast1' }ex36Hello.doFirst { println 'dowFirst' }ex35Hello.doLast { println project.hasProperty('ex36Hello') // 说明每一个任务都是Project的一个属性 println 'dowLast2' }

  • 在Project中每一个task都是一个属性,我们从上面返回的判定结果中就可见一斑。
    Gradle连载2-多种方式创建任务
    文章图片

    五、自定义属性
    // 自定义一个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连载2-多种方式创建任务
    文章图片

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

  • 【Gradle连载2-多种方式创建任务】在build.gradle文件中可以使用Java代码,Groovy代码和Gradle,灵活使用这些代码,可以使工程更能智能,多样化。
    七、源码
  • gitee路径:https://gitee.com/dongqianrui...
  • CSDN:https://blog.csdn.net/weixin_...
  • 博客园:https://www.cnblogs.com/ruige...
  • 欢迎关注微信公众号:傅里叶变换,个人账号,仅用于技术交流
    Gradle连载2-多种方式创建任务
    文章图片
本文由博客一文多发平台 OpenWrite 发布!

    推荐阅读