手记

groovy-gradle-task(二)

//task依赖:task输入输出TaskInput TaskOutput对应task的两个属性inputs,outputs.
// wirteTask和readTask通过共同操作的属性destFile关联了起来

//gradle 规定输出属性对应的task会(生产者)先执行,输入属性对应的task后执行
ext{
    versionName='1.0.0'
    versionCode='10'
    versionInfo='App的第一个版本'
    destFile=file('realease.xml')
    if(destFile!=null && destFile.exists()){
        destFile.createNewFile()
    }

}
//输出文件
task writeTask{
    //为task指定输入
    inputs.property('versionCode',this.versionCode)
    inputs.property('versionName',this.versionName)
    inputs.property('versionInfo',this.versionInfo)
    outputs.file destFile
    doLast{
        def data=inputs.getProperties()
        File file=outputs.getFiels().getSingleFile()
        //将map转化为实体对象
        def versionMsg=new VersionMsg(data);
        //将实体数据转换成xml格式数据
        def sw=new StringWriter()
        def xmlBuilder=new MarkupBuilder(sw);
        if(file.text!=null && file.text.size()<=0){//文件中没有内容
            xmlBuilder.releases{
                release{
                    versionCode(versionMsg.versionCode)
                    versionName(versionMsg.versionName)
                    versionInfo(versionMsg.versionInfo)
                }
            }
            file.withWriter {wirter-> Writer.append(sw.toString())}
        }else{
            //已有版本
            xmlBuilder.release{
                versionCode(versionMsg.versionCode)
                versionName(versionMsg.versionName)
                versionInfo(versionMsg.versionInfo)
            }
            //将生成的xml数据插入到根节点之前
            def lines=file.readLines()
            def lengths=lines.size()-1
            file.withWriter {
                lines.eachWithIndex{ String entry, int i ->
                    if(i!=lengths){
                        it.append('\r\r\n'+sw.toString()+'\r\n')
                        it.append(lines.get(lengths))
                    }

                }
            }
        }
    }
}
//输入文件
task readTask{
    inputs.file destFile
    doLast{
        def file=inputs.files.singleFile
        println(file.text())
    }
}

class VersionMsg{
    String versionCode
    String versionName
    String versionInfo
}
//测试task
tast testTast(dependsOn:[readTask,writeTask]){
    doLast{
        println("输入输出任务结束")
    }
}
//将wirteTask挂载到build task执行之后.
this.project.afterEvaluate {
    def buildTask=project.tasks.getByName('build')
    if(buildTask==null){
        throw GradleException("thie build task is not found")
    }
    buildTask.doLast {
        writeTask.execute()
    }
}

//执行顺序指定mustRunAfter 强制 shouldRunAfter不强制.
task taskA{

    doLast{
        println('taskA')
    }
}
task taskB{
    mustRunAfter taskA
    doLast{
        println('taskB')
    }
}task taskC{
    mustRunAfter taskB
    doLast{
        println('taskC')
    }
}
//task挂载到build task构建声明周期中.
taskA.mustRunAfter variantOutput.processManifest
variantOutput.processResources.dependsOn taskA
//这样taskA就会在variantOutput.processManifest之后,variantOutput.processResources task之前.这两个task之间执行.

//task类型project 提供的创建task 都是DefaultTask类型.具体有哪些类型可以使用查看官方文档.

原文链接:http://www.apkbus.com/blog-953329-77651.html

0人推荐
随时随地看视频
慕课网APP