Gradle Task總結

Task定義和配置

Task定義

//第一種方法,直接使用project的task()方法建立
task helloTask{
    println 'this is helloTask'
}

//第二種方法,使用TaskContainer建立task
this.tasks.create(name:'helloTask2'){
    println 'this is helloTask2'
}
複製代碼

Task配置

//第一種配置方法,建立的時候就配置task的group和description
//description就是個說明,相似對註釋
task helloTask(group:'imooc',description:'task learn'){
    println 'this is helloTask'
}

this.tasks.create(name:'helloTask2'){
    //第二種配置方式:直接在閉包中配置
    setGroup('imooc')
    setDescription('task learn')
    println 'this is helloTask2'
}
複製代碼

Task執行與實戰

Task執行

task helloTask(group:'imooc',description:'task learn'){

    //直接寫在閉包裏面的,是在配置階段就執行的
    println 'this is helloTask'

    doFirst {
        println 'task in do first'  //運行任務時,會第一個執行
    }

    doLast {
        println 'task in do last'   //運行任務時,會最後一個執行
    }
}
複製代碼

Task實戰

def startBuildTime
def endBuildTime

//配置完後,全部的task的拓撲圖都已經生成好了
//保證要找的task已經配置完畢
this.afterEvaluate { Project project ->
    
    //找到第一個執行的task
    def preBuildTask = project.tasks.getByName('preBuild')
    preBuildTask.doFirst {
        startBuildTime = System.currentTimeMillis()
        println 'the start time is:' + startBuildTime
    }

    //找到最後一個編譯的build任務
    def buildTask = project.tasks.getByName('build')
    buildTask.doLast {
        endBuildTime = System.currentTimeMillis()
        println 'the build time is:' + (endBuildTime - startBuildTime)
    }
}

複製代碼

Task執行順序

Task依賴

task taskx {
    doLast {
        println 'taskx'
    }
}
 
task tasky {
    doLast {
        println 'tasky'
    }
}

//第一種寫法 
task taskz(dependsOn: [taskx, tasky]) {
    doLast {
        println 'taskz'
    }
}
//第二種寫法
taskz.dependsOn(taskx, tasky)

複製代碼

Task動態依賴

task taskz{
    doLast {
        println 'taskz2'
    }
}

taskz.dependsOn {
    tasks.findAll { task -> task.name.startsWith('lib') }
}

task lib1 {
    doLast {
        println 'lib1'
    }
}

task lib2 {
    doLast {
        println 'lib2'
    }
}

task nolib {
    doLast {
        println 'nolib'
    }
}
複製代碼

Task依賴實戰

task handleReleaseFile {
    def srcFile = file('releases.xml')
    def destDir = new File(this.buildDir, 'generated/release/')
    doLast {
        println '開始解析對應的xml文件。。。'
        destDir.mkdir()
        def releases = new XmlParser().parse(srcFile)
        releases.release.each { releaseNode ->
            //解析每一個release節點的內容
            def name = releaseNode.versionCode.text()
            def versionName = releaseNode.versionName.text()
            def versionInfo = releaseNode.versionInfo.text()
            //建立文件並寫入節點內容
            def destFile = new File(destDir, "release-${name}.text")
            destFile.withWriter { writer ->
                writer.write("${name} -> ${versionName} -> ${versionInfo}")
            }
        }
    }
}
 
task handleReleaseFileTest(dependsOn: handleReleaseFile) {
    def dir = fileTree(this.buildDir.path + 'generated/release/')
    doLast {
        dir.each {
            println 'the file name is ' + it
        }
        println '輸出完成。。。'
    }
}
複製代碼

Task輸入和輸出

ext {
    versionName = '1.0.6'
    versionCode = '105'
    versionInfo = 'App的第2個版本,上線了一些最基礎核心的功能.'
    destFile = file('releases.xml')
    if (destFile != null && !destFile.exists()) {
        destFile.createNewFile()
    }
}

task writeTask {
    inputs.property('versionCode', this.versionCode)
    inputs.property('versionName', this.versionName)
    inputs.property('versionInfo', this.versionInfo)
    outputs.file this.destFile
    doLast {
        //將輸入的內容寫入到輸出文件中去
        def data = inputs.getProperties()
        File file = outputs.getFiles().getSingleFile()
        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 { writer -> writer.append(sw.toString())
            }
        } else {
            //已有其它版本內容
            xmlBuilder.release {
                versionCode(versionMsg.versionCode)
                versionName(versionMsg.versionName)
                versionInfo(versionMsg.versionInfo)
            }
            //插入到最後一行前面
            def lines = file.readLines()
            def lengths = lines.size() - 1
            file.withWriter { writer ->
                lines.eachWithIndex { line, index ->
                    if (index != lengths) {
                        writer.append(line + '\r\n')
                    } else if (index == lengths) {
                        writer.append('\r\r\n' + sw.toString() + '\r\n')
                        writer.append(lines.get(lengths))
                    }
                }
            }
        }
    }
}

class VersionMsg {
    String versionCode
    String versionName
    String versionInfo
}

task readTask {
    //指定輸入文件爲上一個task的輸出
    inputs.file this.destFile
    doLast {
        //讀取輸入文件的內容並顯示
        def file = inputs.files.singleFile
        println file.text
    }
}

task taskZ {
    setGroup('imooc')
    dependsOn writeTask, readTask
    doLast {
        println '輸入輸出任務結束'
    }
}
複製代碼

掛接自定義Task

task taskX {
    doLast {
        println 'taskx'
    }
}

task taskY {
    mustRunAfter taskX
    doLast {
        println 'taskY'
    }
}

task taskZ {
    mustRunAfter taskY
    doLast {
        println 'taskZ'
    }
}

執行命令
C:\Users\zhongyu\Desktop\Test>gradlew taskY taskZ taskX

執行結果

> Task :app:taskX
taskx

> Task :app:taskY
taskY

> Task :app:taskZ
taskZ

複製代碼

掛接實戰

this.project.afterEvaluate { project ->
    def buildTask = project.tasks.getByName('build')
    if(buildTask == null) {
        throw GradleException('the build task is not found')
    }

    buildTask.finalizedBy writeTask
}
複製代碼

參考:

相關文章
相關標籤/搜索