gradle脚本中只有task可以让配置脚本能在执行阶段执行,其他都是在配置阶段执行.
task定义及配置:
//执行 ./gradlew tasks 查看工程中有多少个task
//定义1:通过task函数创建
/**
- parms task name
- parms coluser
*/
task helloTask {
println("测试tasks")
}
//执行 ./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}:::{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("输出完成::::::::")
}
}
网友评论