上一階段,咱們知道了project是gradle的入口,同時細緻瞭解了project系列知識, 如:Project的API家族概述/Project API/拓展屬性等,更多具體的細節能夠回顧下面章節:markdown
接下來,咱們將開啓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
(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 定義============================================='
}
複製代碼
執行結果:
(2)set方法配置
代碼:
this.tasks.create(name: 'daviTask4') {
println '============start 定義======================='
setGroup('davi2')
setDescription('davi2 配置描述')
println '【task的配置】【set方法配置】i am daviTask4'
println '============end 定義========================='
}
複製代碼
執行結果:
除了例子中的group,description屬性以外咱們能夠配置,還有以下也能夠配置(具體看本身的實際狀況):
代碼:
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在執行階段============================================='
}
複製代碼
執行結果:
能夠看出,外部指定的 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 統計【執行階段】打包時長=========================================='
}
}
複製代碼
代碼:
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 執行完了"
}
}
複製代碼
執行結果:
實現利用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())
}
}
}
複製代碼
代碼:
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)
}
複製代碼
執行結果:
代碼:
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)
}
複製代碼
執行結果:
哈哈,該篇就寫到這裏(一塊兒體系化學習,一塊兒成長)