Task
- 調用Project的task()方法創建Task
在使用Gradle時,創建Task最常見的方式便是:
task helloword << {
println 'hello Gradle!'
}
這里的“<<”表示追加的意思,即向hello中加入執行過程。我們還可以使用doLast來達到同樣的效果:
task helloword2 {
doLast { println 'hello grade 2 !'}
}
另外,如果需要向Task的最前面加入執行過程,我們可以使用doFirst:
task helloword3 {
doFirst { println 'hello grade 3 !'}
}
以上我們自定義的3個Task都位于TaskContainer中,Project中的tasks屬性即表示該TaskContainer。為此,我們可以新建一個Task來顯示這些信息:
task showTasks {
println tasks.class
println tasks.size()
}
輸出結果:
> Configure project :
The Task.leftShift(Closure) method has been deprecated and is scheduled to be removed in Gradle 5.0. Please use Task.doLast(Action) instead.
at build_dm49rdwdh0ayv2low2to9ie29.run(/Users/liyang/gradle_demo/build.gradle:33)
class org.gradle.api.internal.tasks.DefaultTaskContainer_Decorated
4
BUILD SUCCESSFUL in 0s
- 通過TaskContainer的create()方法創建Task
在上文中我們講到,通過task()方法創建的Task都被存放在了TaskContainer中,而Project又維護了一個TaskContainer類型的屬性tasks,那么我們完全可以直接向TaskContainer里面添加Task。查查TaskContainer的API文檔可以發現,TaskContainer向我們提供了大量重載的create()方法用于添加Task。
tasks.create(name: 'hello4]word4') << {
println 'hello grade 4 !'
}
輸出結果:
> Configure project :
The Task.leftShift(Closure) method has been deprecated and is scheduled to be removed in Gradle 5.0. Please use Task.doLast(Action) instead.
at build_dm49rdwdh0ayv2low2to9ie29.run(/Users/liyang/gradle_demo/build.gradle:33)
class org.gradle.api.internal.tasks.DefaultTaskContainer_Decorated
4
hello Gradle 4 !
BUILD SUCCESSFUL in 0s
- 聲明Task之間的依賴關系
Task之間是可以存在依賴關系,比如TaskA依賴TaskB,那么在執行TaskA時,Gradle會先執行TaskB,再執行TaskA。我們可以在定義一個Task的同時聲明它的依賴關系:
task helloword5(dependsOn: helloword2) << {
println 'hello Gradle 5 !'
}
輸出結果:
> Configure project :
The Task.leftShift(Closure) method has been deprecated and is scheduled to be removed in Gradle 5.0. Please use Task.doLast(Action) instead.
at build_dm49rdwdh0ayv2low2to9ie29.run(/Users/liyang/gradle_demo/build.gradle:33)
hello Gradle 4 !
class org.gradle.api.internal.tasks.DefaultTaskContainer_Decorated
7
> Task :helloword2
hellow gradle 2 !
> Task :helloword5
hello Gradle 5 !
BUILD SUCCESSFUL in 0s
2 actionable tasks: 2 executed
當然,我們也可以在定義Task之后再聲明依賴:
task helloword6 << {
println 'hello Gradle 6 !'
}
hellword6.dependsOn helloword
輸出結果
> Configure project :
The Task.leftShift(Closure) method has been deprecated and is scheduled to be removed in Gradle 5.0. Please use Task.doLast(Action) instead.
at build_dm49rdwdh0ayv2low2to9ie29.run(/Users/liyang/gradle_demo/build.gradle:33)
hello Gradle 4 !
class org.gradle.api.internal.tasks.DefaultTaskContainer_Decorated
7
> Task :helloword
hello gradle!
> Task :helloword6
hello Gradle 6 !
BUILD SUCCESSFUL in 0s
2 actionable tasks: 2 executed
- 配置Task
一個Task除了執行操作之外,還可以包含多個Property,其中有Gradle為每個Task默認定義的Property,比如description,logger等。另外,每一個特定的Task類型還可以含有特定的Property,比如Copy的from和to等。當然,我們還可以動態地向Task中加入額外的Property。在執行一個Task之前,我們通常都需要先設定Property的值,Gradle提供了多種方法設置Task的Property值。
首先,我們可以在定義Task的時候對Property進行配置:
task helloword7 << {
description = "this is helloword 7"
println description
}
輸出結果:
The Task.leftShift(Closure) method has been deprecated and is scheduled to be removed in Gradle 5.0. Please use Task.doLast(Action) instead.
at build_dm49rdwdh0ayv2low2to9ie29.run(/Users/liyang/gradle_demo/build.gradle:33)
class org.gradle.api.internal.tasks.DefaultTaskContainer_Decorated
4
hello Gradle 4 !
> Task :helloword7
this is helloword 7
BUILD SUCCESSFUL in 0s
1 actionable task: 1 executed
我們還可以通過調用Task的configure()方法完成Property的設置:
task helloword8 << {
println description
}
helloword8.configure {
description = "this is helloword8"
}
輸出結果:
> Configure project :
The Task.leftShift(Closure) method has been deprecated and is scheduled to be removed in Gradle 5.0. Please use Task.doLast(Action) instead.
at build_dm49rdwdh0ayv2low2to9ie29.run(/Users/liyang/gradle_demo/build.gradle:33)
class org.gradle.api.internal.tasks.DefaultTaskContainer_Decorated
4
hello Gradle 4 !
> Task :helloword8
this is helloword8
BUILD SUCCESSFUL in 0s
1 actionable task: 1 executed