groovy-gradle-task(二)

piny發表於2021-09-09
//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() 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('rrn'+sw.toString()+'rn')
                        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

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3034/viewspace-2811844/,如需轉載,請註明出處,否則將追究法律責任。