1. 程式人生 > >Gradle中task使用, 構建指令碼

Gradle中task使用, 構建指令碼

文章目錄


每一個Gradle構建都包含三個基本構建快:project, task, property

  • project專案:
    一個project表示一個正在構建的元件,每一個構建指令碼build.gradle至少定義一個指令碼
    專案的屬性和方法可以直接使用,不需要使用project變數
  • task任務
    任務動作定義了一個當任務執行時的最小工作單元
  • property屬性
    每一個project和task都提供getter和setter訪問屬性
    擴充套件屬性:

1)使用ext名稱空間來宣告

project.ext.myProp = ‘myValue’
或者 ext{
someOtherProps =123 //key-value的形式,
}

2)也可以通過gradle.properties新增屬性這個屬性是屬於全域性的位於<USER_HOME>.gradle目錄下或者專案的根目錄下,一個使用者這個檔案只有一個,可以手動建立這個gradle.properties檔案(必須是這個名字,系統預設)
  設定屬性myprop =myvalue
3)通過命令列新增
  專案屬性通過-P 命令列選項提供
  系統屬性通過-D 命令列選項提供

4)環境屬性通過ORG_GRADLE_PROJECT_propertyName=someValue

1.gradle的生命週期

分為三個階段:初始化階段,配置階段,執行階段

  • 初始化階段: Gradle可以構建一個和多個專案。在初始化階段,Gradle會確定哪些專案參與構建,並且為這些專案建立一個Project例項。
  • 配置階段: 在這個階段,會配置project物件。將執行構建的所有專案的構建指令碼。也就是說,會執行每個專案的build.gradle檔案。
  • 執行階段: Gradle確定要在執行期間建立和配置的任務子集。子集由傳遞給gradle命令和當前目錄的任務名稱引數確定。 Gradle然後執行每個選定的任務。

簡單點說:
   初始化階段會例項化 setting.gradle裡面宣告的專案,特別是多專案的時候
   配置階段主要是配置task(系統的以及自定義宣告的)
   執行階段(會執行系統給定的task以及自定義task中的doFirst和doLast方法)
參考:https://www.jianshu.com/p/b9b5acf24bb6

2.使用task

2.1 宣告動作

  動作包含doFirst ,doLast

task printlnVersion01{
		doFirst{
 			println ' prilnt verison firstly: $version'
 		} 
	    doLast{
		  println ' prilnt verison last: $version'
		}
}
//doLast也可以這樣表示
task  printlnVersion02 << {    //  ’<<’ 優點追加的感覺
      println ' prilnt verison last: $version'
 }
//也可以給現有的任務新增動作
printlnVersion02.doFirst{
        println ' prilnt verison firstly: $version'
}

2.2 訪問DefaultTask屬性

2.2.1 logger屬性

gradle提供了基於SLF4J日誌庫的logger實現,可以直接在指令碼中使用logger屬性

task  printlnVersion02 << {   
      logger.info(' prilnt verison last: $version')
 }
2.2.2 group和description屬性
//作為引數賦值
task printVersion(group: 'versioning',description:'println version') << {
    logger.info(' print verison last: $version')
}
//或者使用setter方法
task printVersion{
    group ='versioning'
    description= 'print version'
    logger.info(' print verison last: $version')
}

2.3 定義task依賴

使用dependsOn來實現,gradle不能保證多個依賴的執行順序

//多個依賴
task first << {println "first"}
task second << {println "second"}

task printlnVersion(dependsOn :[second,first]) <<{  //這裡依賴的first,second不是看這裡的順序,
    logger.quiet("print version")
}
//單個依賴
task third << {println "first"}
third.denpendsOn('printlnVersion')

2.4 終結器task

常用來在所以來的task執行完後清理資源使用


task first << {println "first"}
task second << {println "second"}

second.finalizedBy first   //在執行了second後執行first

2.5 理解task配置

  宣告的task沒有使用doFirst ,doLast或者‘<<’的都是task配置,這個task配置是在配置階段構建。

2.6 宣告task的inputs和outputs

  gradle通過比較兩個構建的task的inputs和outputs來決定task是否是最新的
,並且只有task的inputs和outputs是不同的,task任務才會執行。

注意點: inputs和outputs是在配置階段生效,不能使用在執行階段程式碼中。如果要在執行程式碼中使用,可以通過TaskOutputs上的upToDateWhen(Closure)方法來訪問,如果閉包放回true,這個task被認為是最新的

2.5 編寫自定義的task類

可以通過繼承DefaultTask類來實現

2.6 掛接到構建的生命週期上

如下簡單的掛接,當然還有很多,建議看官網
在這裡插入圖片描述

2.7 實現task執行圖監聽器

可以簡單的實現TaskExecutionGraphListener介面,實現graphPopulated方法
並把這個例項註冊到task圖中去。建議看官網