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
}
复制代码

参考:

相关文章
相关标签/搜索