一、闭包委托
-
闭包有thisObject、owner、delegate三个属性,在闭包内调用办法的时候,由他们来确定应用哪个对象呢来进行解决。默认状况下delegate和owner是相等的,过后delegate是能够被批改的,这个性能是十分弱小的,Gradle中的闭包很多性能都是通过批改delegate进行实现的。
<code class="groovy">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) } }
<code class="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) }
二、task,doFirst,doLast
<code class="gradle">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办法,别离在工作执行前后输入了一段文字,除此之外还有其余办法,属性等。
三、工作依赖
<code class="groovy">task ex35Hello { println 'hello' } task ex35Main(dependsOn: ex35Hello) { doLast { println 'main' } }
-
从下面能够看进去工作ex35Main是依赖第一个工作,咱们在这外面写入了dependsOn关键字,进行增加前置工作,上面来看一下,减少一下多个工作
<code class="groovy">task ex35Hello { println 'hello' } task ex35Main(dependsOn: ex35Hello) { doLast { println 'main' } } task ex35World { println 'world' } task ex35MultiTask { dependsOn ex35Hello, ex35World doLast { println 'multiTask' } }
四、工作键通过API管制、交互
<code class="groovy">task ex36Hello { println 'dowLast1' } ex36Hello.doFirst { println 'dowFirst' } ex35Hello.doLast { println project.hasProperty('ex36Hello') // 阐明每一个工作都是Project的一个属性 println 'dowLast2' }
-
在Project中每一个task都是一个属性,咱们从下面返回的断定后果中就可见一斑。
五、自定义属性
<code class="groovy">// 自定义一个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文件,便于解决抵触。
六、脚本代码
<code class="groovy">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://www.gaodaima.com/weixin_…
- 博客园:https://www.cnblogs.com/ruige…
- 欢送关注微信公众号:傅里叶变换,集体账号,仅用于技术交换
本文由博客一文多发平台 OpenWrite 公布!