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

90 阅读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)
    }
}

在这里插入图片描述

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

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

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

  • 自定义的属性都生效了,在项目中一般使用它来自定义版本号和版本名称,把版本号和版本名称单独放在一个Gradle文件中,因为他们每次发布版本的时候都会改变,变动频繁,放到一个单独的Gradle文件中,便于管理,而且改动的时候不会因为Git冲突影响整个Build文件,便于解决冲突。

六、脚本代码

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

七、源码

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