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
}
複製代碼
參考: