gradle構建腳本


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

image-20201114222359208

並且在該目錄下生成了.gradle文件夾:

循環:相當於從0打印到3

image-20201114222729274

輸出:

image-20201114222805105

繼續修改腳本:我去掉了hello任務中的doLast塊,並且在hello任務前添加了一個新的world任務。

image-20201114223100899

執行:gradle -q world

image-20201114223223789

build的三個階段

  • initialization:gradle支持單個或多個工程的構建,在構建階段,gradle決定哪些工程參與到當前構建過程,並為每一個這一樣的工程創建一個project實例,一般情況下,參與構建的工程信息將在setting.gradle中定義。
  • configuration:在這一階段,配置project的實例,所有工程的構建腳本都將被執行。Task,configuration和其他的對象都將被創建和配置。
  • execution:在之前的配置階段,task的一個子集被創建並配置,這些子集來自於作為參數傳入gradle命令的task名字,在execution階段,這一子集將依次被執行。

doLast在execution階段執行,沒寫doLast的在configuration這一階段完成。

例如,下面的腳本:

image-20201114224225560

image-20201114224212640

image-20201114224344391

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

image-20201114225212977

在一個文件中可以同時存在java語法、gradle語法、scala語法。

我沒學過scala,這里不再演示。

任務

任務依賴

第一種

這里world任務依賴hello,所以我們執行world時,會先執行hello

task hello{
	doLast{
		println 'hello'
	}
}

task world(dependsOn:hello){
	doLast{
		println 'world'
	}
}

image-20201115112719021

第二種

此外,任務之間依賴也可以這樣寫:

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'
	}
}

image-20201115113557079

循環依賴

task hello(dependsOn:world){
	doLast{
		println 'hello'
	}
}

task world(dependsOn:hello){
	doLast{
		println 'world'
	}
}

會報錯!所以任務之間不能相互依賴。

image-20201115112850597

向任務添加描述

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'
	}
}

image-20201115114327638


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM