上一篇我們學了一些基本操作,比如任務依賴,動態任務,操作已存在的任務等等,接下來我們繼續:
快捷的表示方法:
你可能注意到前面的例子中,我們有一個方便的方式去操作已經存在的任務。每一個任務都作爲構建腳本的一個屬性存在。
例如:
build.gradle
task hello << {
println 'Hello World!'
}
hello.doLast{
println "Greetings from the $hello.name task."
}
gradle -q hello 的輸出爲:
Hello World!
Greetings from the hello task.
注意:
又遇到一個坑:如果把上面的 println "Greetings from the $hello.name task." 這一句的雙引號改爲單引號,你會發現輸出的是:Greetings from the $hello.name task. 前面也舉過這樣的例子,我想大家應該知道單引號 與
雙引號 的 區別了
這使得對於任何可讀的gradle代碼,特別是當使用的任務是以插件的形式提供時,更易於操作任務,比如編譯任務。
任務(task)其他的屬性:
你可以爲一個任務(task)添加你自己定義的屬性,添加一個屬性名爲 myProperty,爲 etc.myProperty 賦 一個初始值,從這一刻開始,這個屬性可以被讀寫就像一個提前定義過的屬性一樣。
例子:
build.gradle:
task myTask {
ext.myProperty = "myValue"
}
task printTaskProperties << {
println myTask.myProperty
}
gradle -q printTaskProperties 的輸出爲:
>gradle -q printTaskProperties
myValue
使用Ant 任務:
在Gradle 中能夠很好的支持 Ant 任務,Gradle 通過簡單的依賴Groovy 能夠爲 Ant 任務 提供極好的整合。Groovy 裝載了出色的 AntBuilder。通過Gradle 使用Ant 任務比通過 build.xml 使用Ant任務 更方便並且功能更強大。通過下面的例子,我們可以學到如何執行一個Ant 任務以及如何 訪問 Ant 任務的 屬性。
例子:
首先在當前 build.gradle 所在的目錄下新建一個目錄 testDir,之後再新建兩個文本文件,內容隨便寫,之後開始編寫以下代碼:
build.gradle
task loadfile << {
def files = file('testDir').listFiles().sort()
files.each { File file ->
if(file.isFile()){
ant.loadfile(srcFile: file,property: file.name)
println "*** $file.name ***"
println "${ant.properties[file.name]}"
}
}
}
執行 gradle -q loadfile 的輸出爲:
>gradle -q loadfile
*** 新建文本文檔 (2).txt ***
這是文檔2
世界,你好
*** 新建文本文檔.txt ***
這是文檔1
以上只是一個簡單的在構建代碼中使用Ant 任務的例子,在後面我們會學習更多相關內容。
使用方法(Method):
Gradle scales in(這個單詞翻譯不好,爲了不歪曲本意,所以不做翻譯,有會的可以留言,謝謝)你如何組織你的構建邏輯,組織你的構建邏輯的第一個層級的方法就像下面的例子一樣,是抽取一個方法。
Example:
tips:文件夾和文件仍然使用前一個例子的不做改變
build.gradle
task checksum << {
fileList('testDir').each{
File file ->
ant.checksum(file: file,property: "cs_$file.name")
println "$file.name Checksum: ${ant.properties["cs_$file.name"]}"
}
}
task loadfile << {
fileList('testDir').each{
File file ->
ant.loadfile(srcFile: file,property: file.name)
println "I'm fond of $file.name"
}
}
File[] fileList(String dir){
file(dir).listFiles({file->file.isFile()} as FileFilter).sort()
}
運行以下命令得到輸出:
>gradle -q loadfile
I'm fond of 新建文本文檔 (2).txt
I'm fond of 新建文本文檔.txt
>gradle -q checksum
新建文本文檔 (2).txt Checksum: 02a120115c8a97fc34a311f08428a3fe
新建文本文檔.txt Checksum: b9c4c5f00c4d30f1c71dfe61609e7879
在後面的學習中你將會體會到類似這樣的方法在多項目構建時可以在各個子項目之間共享使用(筆者理解:提高代碼的重用率,避免相同的代碼重複寫),如果你的構建邏輯變得非常複雜,Gradle 提供了非常便捷的方式去組織它們,在後面的章節會學到。
默認任務:
Gradle 允許你定義一個或多個默認任務,如果沒有指定要執行的任務,這些任務將被執行。
Example:
build.gradle
defaultTasks 'clean','run'
task clean << {
println 'Default Cleaning!'
}
task run << {
println 'Default Running!'
}
task other << {
println "I'm not a default task!"
}
運行以下命令將輸出:
>gradle -q
Default Cleaning!
Default Running!
這種方式等價於執行 gradle clean run,在一個多項目構建中每一個子項目可以擁有它自己指定的默認任務。如果一個子項目沒有明確指定默認任務,那麼會使用父項目的默認任務(前提是父項目定義了默認任務)。
通過 DAG 配置:
在後面的章節我們會詳細介紹,Gradle 有一個配置階段和一個執行階段,在配置階段結束後,Gradle 就知道了要執行的所有的 任務。Gradle 給你提供了一個 hook(鉤子,相當於一個用戶接口interface)去使用這些信息。其中一個使用情景就是:可以檢查 發佈任務 是否在要執行的任務之中,依靠它,我們可以爲一些變量賦不同的值。
在下面這個例子中,任務 distribution 和 release的執行導致 版本 變量得到不同的值。
build.gradle
task distribution << {
println "We build the zip with version=$version"
}
task release(dependsOn: 'distribution') << {
println "We release now"
}
gradle.taskGraph.whenReady{taskGraph ->
if(taskGraph.hasTask(release)){
version = '1.0'
}else{
version = '1.0-SNAPSHOT'
}
}
執行以下命令:
>gradle -q distribution
We build the zip with version=1.0-SNAPSHOT
>gradle -q release
We build the zip with version=1.0
We release now
得到上面的結果,最重要的是: whenReady 影響了 release 任務在它執行之前。當release 任務不是主要的 任務時它也會起作用。
接下來學習什麼:
從前面的幾篇博客直到現在,我們第一次接觸了 task(任務),但並沒有學習結束,在後面的章節中我們會學習更多關於task的知識。