【Gradle系列】Gradle之Task

引言

上一階段,咱們知道了project是gradle的入口,同時細緻瞭解了project系列知識, 如:Project的API家族概述/Project API/拓展屬性等,更多具體的細節能夠回顧下面章節:markdown

Gradle 之Project詳解(一)閉包

Gradle之Project詳解(二)app

Gradle之Project詳解(三)函數

接下來,咱們將開啓gradle的下一個重要的模塊task;post

定義

(1)直接task函數建立法,直接在 project 中定義task方式,最後都會被加到 project中的 tasks中,tasks 是一個TaskContainer類,主要是用來管理project中的全部的task;學習

代碼:gradle

task daviTask1 {
    println '============start 定義================'
    println '【task的定義】【直接task函數建立法】i am daviTask1'
    println '============end 定義================'

}
複製代碼

執行結果:ui

task-定義.png

(2)利用project的TaskContainer方式建立this

this.tasks.create(name: 'daviTask2') {
    println '============start 定義======================='
    println '【task的定義】【TaskContainer】i am daviTask2'
    println '============end 定義========================='
}
複製代碼

配置

(1)定義的時候配置lua

代碼:

task daviTask3(group: 'davi', description: 'davi 配置描述') {
    println '============start 定義=========================================='
    println '【task的配置】【定義的時候直接配置(key-valus模式)】i am daviTask3'
    println '============end 定義============================================='

}
複製代碼

執行結果:

配置組.png

(2)set方法配置

代碼:

this.tasks.create(name: 'daviTask4') {
    println '============start 定義======================='

    setGroup('davi2')
    setDescription('davi2 配置描述')

    println '【task的配置】【set方法配置】i am daviTask4'
    println '============end 定義========================='
}
複製代碼

執行結果:

set方法配置.png

除了例子中的group,description屬性以外咱們能夠配置,還有以下也能夠配置(具體看本身的實際狀況):

1.png

執行

代碼:

task daviTask5(group: 'davi', description: 'davi 配置描述') {
    doFirst {
        println '============start task在執行階段=========================================='
        println '【daviTask5】【task在執行階段】【閉包中的...】i am daviTask5'
        println '============end task在執行階段============================================='
    }
}
daviTask5.doFirst {
    println '============start task在執行階段=========================================='
    println '【daviTask5】【task在執行階段】【閉包外面的...】i am daviTask5, 先於閉包內的執行'
    println '============end task在執行階段============================================='
}
複製代碼

執行結果:

執行階段-裏-外優先級.png

能夠看出,外部指定的 doFirst 會比內部指定的先執行

小案例學習

經過task,統計【執行階段】打包時長

//時機選擇配置以後,確保task的拓撲圖已經完成了
this.afterEvaluate { Project project ->
    println '============start 統計【執行階段】打包時長=========================================='

    def startTime, endTime

    //執行階段的第一個task都是'preBuild'
    def firstTask = project.tasks.getByName('preBuild')
    firstTask.doFirst {
        //記錄第一個task執行以前的時間
        startTime = System.currentTimeMillis()
    }

    //執行階段最後一個task是'build'
    def lastTask = project.tasks.getByName('build')
    lastTask.doLast {
        //記錄最後一個task的執行以後的時間
        endTime = System.currentTimeMillis()
        //結果
        println "統計【執行階段】打包時長結果爲:${endTime - startTime}"

        println '============start 統計【執行階段】打包時長=========================================='
    }

}
複製代碼

dependsOn依賴方式執行

代碼:

task daviTask111(group: 'davi') {
    doLast {
        println "daviTask111 doLast 執行完了"
    }
}

task daviTask222(group: 'davi') {
    doLast {
        println "daviTask222 doLast 執行完了"
    }
}

//dependsOn 依賴
task daviTask333(group: 'davi', dependsOn: [daviTask111, daviTask222]) {
    doLast {
        println "daviTask333 doLast 執行完了"
    }
}
複製代碼

執行結果:

執行順序-依賴-dependsOn.png

task的輸入和輸出

實現利用task的輸入輸出,實現把字符串寫入文件;

def taskApiFile
task taskWriteApiFile(group: 'davi') { Task t ->
    //定義
    def vName = '1.0.0111'
    taskApiFile = file('taskApiFile.xml')
    if (!taskApiFile.exists()) {
        println "【輸入輸出方式】 【taskWriteApiFile】文件不存在,建立.."
        taskApiFile.createNewFile()
    } else {
        println "【輸入輸出方式】 【taskWriteApiFile】文件存在.."
    }

    //指定輸入
    t.getInputs().property('vName', vName)
    //指定輸出
    t.getOutputs().file(taskApiFile)

    //輸出輸出的執行使用
    t.doLast {
        println "【輸入輸出方式】 【taskWriteApiFile】輸入的內容,保存到輸出的文件中.."

        //獲取輸入/輸出
        Map<String, Object> data = t.getInputs().getProperties()
        File f = t.getOutputs().getFiles().singleFile

        //輸入的內容,保存到輸出的文件中
        StringWriter sw = new StringWriter()
        sw.write(data.get('vName'))
        f.withWriter { BufferedWriter writer ->
            writer.append(sw.toString())
        }
    }
}
複製代碼

mustRunAfter 方式執行

代碼:

task task666(group: 'davi') { Task t ->
    t.doLast {
        println "task666"
    }
}

task task777(group: 'davi') { Task t ->
    t.mustRunAfter(task666)

    t.doLast {
        println "task777"
    }
}

task task888(group: 'davi') { Task t ->
    t.mustRunAfter(task777)

    t.doLast {
        println "task888"
    }
}

task taskTest667788(group: 'davi') { Task t ->
    t.dependsOn(task777, task888, task666)
}
複製代碼

執行結果:

mustRunAfter.png

自定義的task,掛到Gradle的build過程當中

代碼:

task taskBeforePreBuild(group: 'davi') { Task t ->
    println "配置階段:【taskAfterPreBuild】"
    doLast {
        println "執行階段:【taskAfterPreBuild】"
    }
}


this.project.afterEvaluate { Project p ->
    println "配置階段完成後.."

    def preBuild = p.tasks.getByName('preBuild')
    preBuild.dependsOn(taskBeforePreBuild)
}
複製代碼

執行結果:

taskBeforePreBuild.png

結尾

哈哈,該篇就寫到這裏(一塊兒體系化學習,一塊兒成長)

相關文章
相關標籤/搜索