一、关于Gradle的Project和Task
Gradle本身的领域对象主要有Project和Task。
Project为Task提供了执行上下文,所有的Plugin要么向Project中添加用于配置的Property,要么向Project中添加不同的Task。
一个Task表示一个逻辑上较为独立的执行过程,比如编译Java源代码,拷贝文件,打包Jar文件,甚至可以是执行一个系统命令或者调用Ant。另外,一个Task可以读取和设置Project的Property以完成特定的操作。
二、关于build.gradle
默认情况下,Gradle将当前目录下的build.gradle文件作为项目的构建文件。
Gradle提供了几个默认的命令:
● gradle task - 查看默认的任务
● gradle project - 查看当前涵盖的工程
● gredle properties - 查看project包含的properties
dependencies用于显示Project的依赖信息,projects用于显示所有Project,包括根Project和子Project,而properties则用于显示一个Project所包含的所有Property
三、Task
多种方式定义Task,所有的Task都存放在Project的TaskContainer中。
● << 追加的方式创建一个task (5.0以后会警告)
task hello1 << {
println 'hello1'
}
● doLast 方式创建一个Task
task hello2 {
doLast {
println 'hello2'
}
}
● doFirst方式创建一个Task
task hello3 {
doFirst {
println 'hello3'}
}
● 通过TaskContainer的create()方法创建Task
tasks.create(name: 'hello4') << {
println 'hello4'
}
由task:
task showTasks {
println tasks.class
println tasks.size()
}
在含有:hello1、hello2、hello3、showTasks的文件运行输出结果:
class org.gradle.api.internal.tasks.DefaultTaskContainer_Decorated
4
4个任务,可以证明gradle默认是顺序执行
四、声明Task依赖
Task之间是可以存在依赖关系,比如TaskA依赖TaskB,那么在执行TaskA时,Gradle会先执行TaskB,再执行TaskA。
● 定义Task的时候就声明依赖
task hello5(dependsOn:hello4) << {
println 'hello5'
}
task hello6 << {
println 'hello6'
}
hello6.dependsOn hello5
五、配置Task,即给Task定义成员变量
一个Task除了执行操作之外,还可以包含多个Property,其中有Gradle为每个Task默认定义的Property,比如description,logger等。另外,每一个特定的Task类型还可以含有特定的Property,比如Copy的from和to等。
● 定义的时候配置Task
task hello7 << {
description = "this is hello7"
println description
}
● 动态配置-即使用闭包的方式来配置一个已有的Task
task hello8 << {
println description
}
hello8 {
description = "this is hello8"
}
注意:对hello8的description设置发生在创建该Task之后,在执行“gradle hello8”时,命令行依然可以打印出正确的“this is hello8”,这是因为Gradle在执行Task时分为两个阶段,首先是配置阶段,然后才是实际执行阶段。所以在执行hello8之前,Gradle会扫描整个build.gradle文档,将hello8的description设置为“this is hello8”,然后执行hello8,此时hello8的description已经包含了设置后的值。
● 调用Task的configure()方法完成Property的设置
task hello9 << {
println description
}
hello9.configure {
description = "this is hello9"
}
实际上,通过闭包的方式配置Task在内部也是通过调用Task的configure()方法完成的,对此我们将在后续的文章中详细地讲到。
Gradle的Project从本质上说只是含有多个Task的容器,一个Task与Ant的Target相似,表示一个逻辑上的执行单元。