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圖中去。建議看官網