一、闭包委托
-
闭包有 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 公布!