//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
打开App,阅读手记