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