每个Gradle的构建都是以一个脚本开始的,当在shell中执行gradle命令的时候,Gradle会去寻找名字是build.gralde
的文件。
我们可以在build.gralde
中创建一个task:
task helloWorld{
doLast{
println 'Hello world!'
}
}
我们可以看到如下输出:
$ gradle -q helloWorld
Hello world!
我们还可以查看所有任务:
$ gradle -q tasks --all
看到如下输出:
------------------------------------------------------------
All tasks runnable from root project
------------------------------------------------------------
Build tasks
-----------
assemble - Assembles the outputs of this project.
build - Assembles and tests this project.
buildDependents - Assembles and tests this project and all projects that depend on it.
buildNeeded - Assembles and tests this project and all projects it depends on.
classes - Assembles main classes.
clean - Deletes the build directory.
jar - Assembles a jar archive containing the main classes.
testClasses - Assembles test classes.
...
Other tasks
-----------
compileJava - Compiles main Java source.
compileTestJava - Compiles test Java source.
helloWorld
Gradle提供了任务组的概念,例如Build tasks
,每个构建脚本都会默认暴露在Other tasks
任务组中。
每个Gradle构建都包含三个基本的构建块:project、task和property,Gradle API中有相应的类来表示project和task。
一个project代表一个正在构建的组件,当构建进程启动后,Gradle基于build.gradle中的配置实例化org.gradle.api.Project
类。
Project类API:
//构建脚本配置
apply()
buildscript()
//依赖管理
dependencies()
configurations()
getDependencies()
getConfigurations()
//getter/setter
getName()
getDescription()
getGroup()
getVerison()
setVersion()
//创建文件
file()
//创建任务
task()
调用project的方法:
setDescription("myProject")
println "Description of project $name: " + project.description
得到输出:
> Configure project :
Description of project gradle-project: myProject
https://tomgregory.com/gradle-project-properties-best-practices/
一个属性可以是一个任务的描述或项目的版本,你也可以通过拓展属性自定义一些变量,使用示例:
project.ext.myProp = 'myValue'
//简写
ext {
someOtherProp = 123
}
assert myProp == 'myValue'
println project.someOtherProp
ext.someOtherProp = 567
org.gradle.api.Task
接口的API:
//task依赖
dependesOn()
//动作定义
doFirst()
doLast()
getActions()
//输入输出数据声明
getInputs()
getOutputs()
//getter/setter
getDescription()
getEnable()
getGroup()
setDescription()
setEnable()
setGroup()
Task接口提供了两个相关的方法来声明task动作:
doFirst(Closure)
doLast(Closure)
当Task被执行的时候,动作逻辑被定义为闭包参数被依次执行。
定义一个打印版本的task:
task printVersion {
doLast {
println "Version: $version"
}
}
输出:
> Task :printVersion
Version: 0.1-SNAPSHOT
上述方法放在doFrist也一样的效果。
还可以为task设置group和description,它们都是task文档的一部分。
task printVersion(group: 'verisoning', description: 'Prints projects version.') {
doLast {
logger.quiet "Version: $version"
println "Version: $version"
}
}
dependsOn方法允许声明依赖其他task。
注意:
- doLast的别名为
<<
- Gradle保证了被依赖的task需要先执行,并不能保证没有依赖关系的task之间的执行顺序
我们可以声明一个task,并不定义动作或者使用<<
,这种task,Gradle称之为task配置。
task配置块永远在task动作执之前被执行。
详见Gradle官方文档。
无论什么时候执行Gradle构建,都会运行三个不同的生命周期阶段:
-
初始化阶段
在初始化阶段,Gradle先解析settings.gradle文件,找出本次构建所依赖的所有项目,并为所有项目创建Project实例。
-
配置阶段
该阶段,Gradle将任务和其他属性添加到上述Project实例中,并根据依赖生成Task执行图。
-
执行阶段
所有的task都应该被以正确的顺序执行。执行的顺序是由它们的依赖决定的,如果任务被认为没有被修改过,将被跳过。
Gradle通过比较两个构建task的inputs和outputs来决定task是否是最新的。
- 书籍:《实战Gradle》