1. 简述
如下代码,执行 monk2 task:
task monk{
println '生命周期第2阶段,配置阶段'
doFirst {
println '生命周期第3阶段,执行阶段,开始'
}
doLast {
println '生命周期第3阶段,执行阶段,结束'
}
}
task monk2(dependsOn:"monk")
/*
> Configure project :
生命周期第2阶段,配置阶段
如果app/build.gradle,有相关task,会按照相关生命周期先执行
> Configure project :app
============== scriptClosure this: project ':app'
============== scriptClosure owner: project ':app'
============== scriptClosure delegate: project ':app'
> Task :monk
生命周期第3阶段,执行阶段,开始
生命周期第3阶段,执行阶段,结束
> Task :monk2
*/
两个 task,都可以单独执行。monk2 task 依赖于 monk task,意思是执行 monk2 时候,必须先执行完 monk 后才能执行,类似方法调用,这样它们之间组成了一个有向无环图:monk task ==> monk2 task
doFirst
:表示 task 执行最开始的时候,被调用;doLast
:表示 task 执行完的时候,被调用;这两个可以被执行多次
2. 属性
常见的一些属性有:
package org.gradle.api;
public interface Task extends Comparable<Task>, ExtensionAware {
String TASK_NAME = "name";
String TASK_DESCRIPTION = "description";
String TASK_GROUP = "group";
String TASK_TYPE = "type";
String TASK_DEPENDS_ON = "dependsOn";
String TASK_OVERWRITE = "overwrite";
String TASK_ACTION = "action";
String TASK_CONSTRUCTOR_ARGS = "constructorArgs";
}
// root -> build.gradle
task myTask{
ext.customproperty = "customproperty"
}
task myTask2{
doLast {
// 1. 可以使用 $ 符号引用另一个 task 的属性
println "myTask name is ${myTask.name}"
// 2. 可以使用 ext 自定义属性
println "myTask name is ${myTask.customproperty}"
}
}
/*
> Task :myTask2
myTask name is myTask
myTask ext.customproperty is customproperty
*/
3. 执行详解
task 一般使用 doFirst
和doLast
两个方法用于在执行期间进行操作,示例代码如下
// root -> build.gradle
task myTask{
println 'this is mytask'
doFirst {
println 'do first'
}
doLast {
println 'do last'
}
}
myTask.doFirst{
println 'out do first'
}
/*
> Configure project :
this is mytask
> Task :myTask
out do first
do first
do last
*/
实战可参考连接中 计算build执行期间的耗时,届时可以分享代码到 blog
还可以参考连接中 自动维护版本发布文档的 gradle 脚本,届时也可以分享代码到 blog
4. 类型
除了定义一个新的 task 之外,我们也可以使用type
属性直接使用一个已有的 task 类型,比如 gradle 自带的 copy、delete、sync 等
task clean(type:Delete){
delete rootProject.buildDir
}
task copyDocs(type:Copy){
from 'src/man/doc'
into 'build/target/doc'
}
// 执行时会复制源文件到目标目录,然后从目标目录删除所有非复制文件
task syncFile(type:Sync){
from 'src/main/doc'
into 'build/target/doc'
}