gradle構建腳本
gradle構建腳本文件用來處理兩件事情,一個是項目另一個就是任務。
每個gradle生成表示一個或多個項目,一個項目表示一個JAR庫或web應用程序,也可能表示由其他項目產生的JAR文件組裝的zip。
簡單的說:一個項目是由不同的任務組成。一個任務是指構建的一塊工作,任務可能是編譯一些類,創建一個JAR,產生Javadoc或發布一些歸檔文件。
編寫構建腳本
gradle提供了一個域特定語言DSL,用於描述構建,它使用·Groovy語言,使其更容易形容和構建。gradle中的么一個構建腳本使用UFT8進行編碼,並命名為build.gradle。
創建build.gradle
我先在E盤創建一個安放gradle腳本的文件夾。E:\project\gradle。
腳本中定義一個任務名稱hello,腳本名為build.gradle,內容如下。
task hello{
doLast{
println 'hello world'
}
}
然后在該目錄下執行gradle -q 任務名
gradle -q hello
並且在該目錄下生成了.gradle文件夾:
循環:相當於從0打印到3
輸出:
繼續修改腳本:我去掉了hello任務中的doLast塊,並且在hello任務前添加了一個新的world任務。
執行:gradle -q world
build的三個階段
- initialization:gradle支持單個或多個工程的構建,在構建階段,gradle決定哪些工程參與到當前構建過程,並為每一個這一樣的工程創建一個project實例,一般情況下,參與構建的工程信息將在setting.gradle中定義。
- configuration:在這一階段,配置project的實例,所有工程的構建腳本都將被執行。Task,configuration和其他的對象都將被創建和配置。
- execution:在之前的配置階段,task的一個子集被創建並配置,這些子集來自於作為參數傳入gradle命令的task名字,在execution階段,這一子集將依次被執行。
doLast在execution階段執行,沒寫doLast的在configuration這一階段完成。
例如,下面的腳本:
jdk語法支持
我們甚至可以在gradle中使用jdk的api以及一些語法.
task hello{
List<String> strs = Arrays.asList("aa","bb");
for(String str : strs){
System.out.println(str);
}
Map<Integer,String> map = new HashMap<>();
map.put(1,"a");
map.put(3,"b");
for(Integer key:map.keySet()){
System.out.println("key:"+key);
println 'value:'+map.get(key)
}
println 'hello world'
}
執行:gradle -q hello
在一個文件中可以同時存在java語法、gradle語法、scala語法。
我沒學過scala,這里不再演示。
任務
任務依賴
第一種
這里world任務依賴hello,所以我們執行world時,會先執行hello
task hello{
doLast{
println 'hello'
}
}
task world(dependsOn:hello){
doLast{
println 'world'
}
}
第二種
此外,任務之間依賴也可以這樣寫:
task hello{
doLast{
println 'hello'
}
}
task world{
doLast{
println 'world'
}
}
world.dependsOn hello
第三種
task hello{
doLast{
println 'hello'
}
}
hello.dependsOn{
tasks.findAll{
task-> task.name.startsWith('world')
}
}
task world1{
doLast{
println 'world1'
}
}
task world2{
doLast{
println 'world2'
}
}
循環依賴
task hello(dependsOn:world){
doLast{
println 'hello'
}
}
task world(dependsOn:hello){
doLast{
println 'world'
}
}
會報錯!所以任務之間不能相互依賴。
向任務添加描述
task world2{
description 'this is world2'
doLast{
println 'world2'
}
}
跳過任務
我們可以拋出StopExecutionException異常,來跳過當前任務,但是不影響下一步任務的執行。
task hello{
doLast{
println 'hello'
}
}
/**在執行hello任務之前,先執行這塊,但是拋出這個異常,hello任務將不執行**/
hello.doFirst{
throw new StopExecutionException()
}
task world(dependsOn: hello){
doLast{
println 'world'
}
}