gradle(4)-task(1)

2018-11-12  本文已影响0人  高斯巴

gradle脚本中只有task可以让配置脚本能在执行阶段执行,其他都是在配置阶段执行.

task定义及配置:

//执行 ./gradlew tasks 查看工程中有多少个task

//定义1:通过task函数创建

/**

//执行 ./gradlew helloTask

//定义2:通过task容器TaskContainer创建, TaskContainer是task的管理类

this.tasks.create(name:'helloTask2'){
println("测试tasks2")
}

//定义方式1和2没有区别,TaskContainer提供了task的查找和添加方法findByPath(),getByPath(),和create()

//无论哪种创建方式,最终taskContainer 都会在gradle的配置阶段构成一个有向无环图.通过这个有向无环图gradle就知道了执行顺序.

//给task进行配置

//1:定义的时候进行配置:group相同的task会被分到相同的组中.

// 有设置group的task会在gradle的Tasks的同一个命名的目录下,没有设置的会统一在other目录下

task helloTask2 (group:'hexin',description:'task test'){
println("测试tasks3")
}

//2:调用配置方法

this.tasks.create(name:'helloTask3'){
setGroup('hexin')
setDescription('tast test')
println("测试tasks4")
}

//task可配置的参数:name,group,description,type,dependsOn:task的依赖于哪一个task,

//overwrite:常用于重写task,action:为task配置要执行的逻辑

//以上task中的测试代码都没有在doFirst或doLast方法中.都是在task配置阶段执行.执行任何一个task,所有task的配置代码都会先执行,所以不管执行了哪个task

//测试tasks1,2,3,4都会输出.

//task在执行阶段执行:在闭包中调用doFirst或 doLast方法.

task helloTask3 (group:'hexin',description:'task test'){
println("测试tasks")
doFirst {
println('task执行阶段执行方式1:闭包中调用,内部调用晚于外部调用')
}
}
helloTask3.doFirst{
println('task执行阶段执行方式2:外部调用,外部调用先执行')
}

//doFirst和doLast的区别:doFist在已经有的task之前添加逻辑,doLast为已经有的task之后添加逻辑

//统计task执行阶段时长的功能

def startBuildTime,endBuildTime

//afterEvaluate在配置阶段执行完,所有的task都会被创建成功了.

this.afterEvaluate {
//保证要找的task都已经配置完毕
Project project->
//找到最开始执行的task
def preBuildTask=project.tasks.getByPath('preBuild')
preBuildTask.doFirst {
startBuildTime=System.currentTimeMillis();
}
//找到最后执行的task
def buildTask=project.tasks.getByPath('build')
buildTask.doLast {
endBuildTime=System.currentTimeMillis()
println("build的时间差:::${endBuildTime-startBuildTime}")
}
}

//决定tasK执行顺序的方式:1:dependsOn 强依赖方式,2:通过task输入输出指定,3:通过api指定执行顺序

//1:添加依赖方式.

tast taskX{
doLast{
println("taskX")
}
}
tast taskY{
doLast{
println("taskY")
}
}
tast taskZ(dependsOn:[taxkX,taskY]){
doLast{
println("taskZ")
}
}
taskZ.dependsOn(taskX,taskY);//taskX,taskY,taskZ

//这中taskX,taskY的执行顺序是随机的.

//动态指定依赖,因为有时候创建的时候并不知道要依赖谁.

// 例子:taskZ依赖所有以lib开头的task

// << 追加符,意思就是loLast();

task lib1 <<{
println("lib1")
}
task lib2 <<{
println("lib2")
}
task nolib <<{
println("nolib")
}

//通过配置阶段的task输出配置dependsOn

tast taskM{
dependsOn this.tasks.findAll {
task->return task.name.startsWith('lib')
}
doLast{
println('taskM')
}
}

//执行结果lib1,lib2,taskM(lib1,lib2先后随机)

//task依赖实战,统计所有版本的信息.

task handleReleaseFile{
def srcFile =file('realease.xml')
def destDir=new File(this.getBuildDir(),'generated/release/')
daLast{
println('开始解析对应的xmL文件')
destDir.mkdir()
def realeases=new XmlParser().parse(srcFile)
realeases.release.each{
realeaseNode->
def name=realeaseNode.versionName.text()
def versionCode=realeaseNode.versionCode.text()
def versionInfo=realeaseNode.versionInfo.text()
def destFile=new File(destDir,"realease-{name}.text") destFile.withWriter { writer->writer.write("{name}:::{versionCode}:::{versionInfo}")
}
}
}
}

//测试task handleReleaseFile的task

task handleReleaseFileTest(dependsOn:handleReleaseFile){
def dir=fileTree(this.getBuildDir()+'generated/release/')
doLast{
dir.each{
println('the file name is:::'+it)
}
println("输出完成::::::::")
}
}

上一篇 下一篇

猜你喜欢

热点阅读