## 1.任務的定義
之前我們定義任務的時候采用的是task + 任務名的方式。例如
~~~
task hello << {
println "hello"
}
~~~
現在再介紹另外兩種方式,和上面的定義是等價的。
~~~
task(hello)<<{
println "hello"
}
~~~
~~~
task('hello')<<{
println "hello"
}
~~~
gradle還提供了一個tasks容器來創建任務,通過調用create方法:
~~~
tasks.create(name:'hello')<<{
println "hello"
}
~~~
## 2\. 任務的定位
**將任務看成項目的屬性的方式**
~~~
task hello
println hello.name
println project.hello.name
~~~
~~~
qianhuis-Mac-mini:0111_1 qianhui$ gradle -q hello
hello
hello
~~~
**使用tasks容器來定位**
~~~
task hello
println tasks.hello.name
println tasks['hello'].name
~~~
~~~
qianhuis-Mac-mini:0111_1 qianhui$ gradle -q hello
hello
hello
~~~
**tasks.getByPath()方式來獲得**
~~~
task hello
println tasks.getByPath('hello').path
println tasks.getByPath(':hello').path
~~~
~~~
qianhuis-Mac-mini:0111_1 qianhui$ gradle -q hello
:hello
:hello
~~~
## 3.配置任務
~~~
task myCopy(type:Copy)
println myCopy.name
~~~
定義一個Copy類型名為myCopy的任務。
~~~
qianhuis-Mac-mini:0111_1 qianhui$ gradle -q myCopy
myCopy
~~~
**配置任務的第一種方式**
~~~
Copy myCopy = task(myCopy,type:Copy)
myCopy.from 'resources'
myCopy.into 'target'
myCopy.include('**/*.txt','**/*.xml','**/*.properties')
~~~
這種方式每次都需要先顯式的定義一個對象。比較麻煩。下面有另外一種更好的方式:
**配置任務的第二種方式**
~~~
Copy myCopy = task(myCopy,type:Copy)
myCopy{
from 'resources'
into 'target'
include('**/*.txt','**/*.xml','**/*.properties')
}
~~~
這種方式適用于任何任務,第二行myCopy是tasks.getByName的縮寫方式。這種方式在配置的時候是有作用的,在執行的時候是不起作用的。
**配置任務的第三種方式**
閉包方式:
~~~
task copy(type:Copy){
from 'resources'
into 'target'
include('**/*.txt','**/*.xml','**/*.properties')
}
~~~
## 4.配置任務依賴
#### 以任務名的方式定義依賴
依賴其他項目的任務,要想實現該例子,首先要記得settings.gradle在多項目的必要性,所以我們先編寫settings.gradle:
~~~
include "projectA","projectB"
~~~
這樣我們的build.gradle就能識別出這兩個子項目,接下來在build.gradle中實現依賴其他項目的任務。
~~~
project('projectA'){
task taskX(dependsOn:':projectB:taskY')<<{
println 'taskX'
}
}
project('projectB'){
task taskY <<{
println 'taskY'
}
}
~~~
執行命令:
~~~
qianhuis-Mac-mini:0111_1 qianhui$ gradle -q taskX
taskY
taskX
~~~
這是在根項目的build.gradle來定義2個子項目的任務。在正常情況下,我們應該是在各自的項目中,然后來定義項目之間的依賴,所以我們現在分拆taskX 和taskY兩個任務到各自的目錄中。
在projectA的build.gradle文件中添加:
~~~
task taskX(dependsOn:':projectB:taskY')<<{
println 'taskX'
}
~~~
在projectB 的build.gradle文件中添加:
~~~
task taskY <<{
println 'taskY'
}
~~~
然后將剛才跟目錄中的build.gradle中的內容刪除,避免造成任務沖突。然后在projectA 下執行命令:
~~~
qianhuis-Mac-mini:projectA qianhui$ gradle -q taskX
taskY
taskX
~~~
#### 你可以通過task對象來配置依賴
~~~
task taskX << {
println 'taskX'
}
task taskY <<{
println 'taskY'
}
taskX.dependsOn taskY
~~~
輸出:
~~~
qianhuis-Mac-mini:0111_1 qianhui$ gradle -q taskX
taskY
taskX
~~~
#### 使用閉包的方式配置依賴
~~~
task taskX << {
println 'taskX'
}
taskX.dependsOn{
tasks.findAll{
task -> task.name.startsWith('lib')
}
}
task lib1<<{
println 'lib1'
}
task lib2 <<{
println 'lib2'
}
~~~
執行任務輸出:
~~~
qianhuis-Mac-mini:0111_1 qianhui$ gradle -q taskX
lib1
lib2
taskX
~~~
## 5.任務順序
(該功能處在孵化階段,以后可能會改變,所以需要注意)
任務順序的兩個規則:must run after 和 should run after。
當你定義taskX和taskY的關系是必須后執行,那就說明taskX必須在taskY任務執行完才能執行,無論在什么時候。
當你定義taskX和taskY的關系時應該后執行,那就說明不是強制要求的,只是這么做更好點,但是我們應該意識到我們講should 等價于must還是比較好的。
現在來試試這兩種順序的執行的不同:
#### mustRunAfter
在build.gradle定義如下:
~~~
task taskX << {
println 'taskX'
}
task taskY <<{
println 'taskY'
}
taskX.mustRunAfter taskY
~~~
上面定義了taskX必須在taskY后執行,但是如果這個時候我們只執行taskX呢?
~~~
qianhuis-Mac-mini:0111_1 qianhui$ gradle -q taskX
taskX
~~~
只執行taskY:
~~~
qianhuis-Mac-mini:0111_1 qianhui$ gradle -q tasky
taskY
~~~
從上面可以看出,單獨執行一個任務,是沒有什么一樣的。那現在我們同時執行兩個任務:
~~~
qianhuis-Mac-mini:0111_1 qianhui$ gradle -q tasky taskx
taskY
taskX
qianhuis-Mac-mini:0111_1 qianhui$ gradle -q taskx tasky
taskY
taskX
~~~
注意上面我們執行了兩次,但是taskX和taskY順序不一樣,但是結果卻是一樣的,這就說明mustRunAfter奏效了。
#### shouldRunAfter
修改build.gradle文件:
~~~
task taskX << {
println 'taskX'
}
task taskY <<{
println 'taskY'
}
taskX.shouldRunAfter taskY
~~~
我們同樣執行4次,輸出如下:
~~~
qianhuis-Mac-mini:0111_1 qianhui$ gradle -q tasky
taskY
qianhuis-Mac-mini:0111_1 qianhui$ gradle -q taskx
taskX
qianhuis-Mac-mini:0111_1 qianhui$ gradle -q taskx tasky
taskY
taskX
qianhuis-Mac-mini:0111_1 qianhui$ gradle -q tasky taskx
taskY
taskX
~~~
看出不同了么?我是沒看出來,所以官方文檔上的例子還是無法說明他們的區別,等有時間再去質問他們吧。
上面需要注意點的是:
taskX.shouldRunAfter taskY == taskX.shouldRunAfter(taskY)
taskX.mustRunAfter taskY ==? taskX.mustRunAfter(taskY)
其中的括號和空格時等效的。所以我們要了解的是gradle中調用方法的方式多種的。
有2種情況會使上面定義的順序失效:2個任務之間有依賴和使用 --continue參數
來看看使之失效的例子,上面的例子taskX在taskY后執行,那么這個時候我們定義taskY依賴taskX呢。按我們之前學習依賴中得到的知識,依賴的任務要先執行到。那么看實際執行情況:
~~~
task taskX << {
println 'taskX'
}
task taskY <<{
println 'taskY'
}
taskY.dependsOn taskX
taskX.shouldRunAfter taskY
~~~
~~~
qianhuis-Mac-mini:0111_1 qianhui$ gradle -q tasky taskx
taskX
taskY
~~~
說明依賴的優先級要高于順序的定義。
## 6.添加任務描述
build.gradle定義如下:
~~~
task taskX {
description 'this a beatiful world'
println 'taskX'
}
task taskY <<{
description 'this a bad world'
println 'taskY'
}
~~~
執行gradle tasks命令輸出:
~~~
Other tasks
-----------
taskX - this a beatiful world
taskY
~~~
為什么taskX和taskY的有一個沒有輸出描述信息,在于taskY的定義中有<<,所以沒能輸出描述信息。那就說明任務的定義中這兩種方式還是有一點區別的。
- 前言
- gradle學習(1)-helloworld
- gradle學習(2)-基礎語法
- gradle學習(3)-基礎認識
- gradle學習(4)-構建java項目
- gradle學習(5)-創建eclipse項目
- gradle學習(6)-依賴管理
- gradle學習(7)-groovy
- gradle學習(8)-gradle的命令行
- gradle學習(9)-獲取build相關信息
- gradle學習(10)-gui
- gradle學習(11)-編寫構建腳本
- gradle學習(12)-groovy一些基礎語法
- gradle學習(13)-有的沒的
- gradle學習(14)-任務
- gradle學習(15)-任務
- gradle學習(16)-操作文件
- gradle學習(17)-被合并的ant
- gradle學習(18)-ant的屬性
- gradle學習(19)-log系統
- gradle學習(20)-詳解java插件
- gradle學習(21)-在eclipse中構建java項目
- gradle復習(1)-2種定義任務方式的區別
- gradle復習(2)-eclipse中添加依賴jar包
- gradle復習(3)-在gradle項目中使用TestNG
- gradle復習(4)-Cannot find System Java Compiler
- gradle復習(5)-Test remote debug
- gradle復習(6)-深入Jacoco
- gradle復習(7)-深入Jacoco
- gradle復習(8)-Task中行為
- gradle學習(22)-Sonar
- gradle學習(23)-Sonar runner