Gradle+Groovy提升篇

建立自定義任務

打開build.gradle文件,並在末尾添加如下內容:閉包

println "1" 
   
task howdy {  
    println "2" 
    doLast {  
        println "Howdy" 
    }  
}

println "3"
這將演示有關Gradle腳本如何工做的一些信息。使用如下命令運行它:gradle

./gradlew howdyui

您將看到(省略了一些多餘的行):插件

> Configure project :
1
2
3
 
> Task :howdy
Howdy

在這裏,Configure project任務將生成並運行生成腳本。在Gradle執行Configure project任務時,它會執行如下操做:命令行

它打第一個println並打印「1」
它找到要執行的howdy任務定義塊,一個閉包,並顯示「2」。請注意,它不會執行doLast關閉操做,所以還沒有打印「Howdy」。
它繼續執行腳本,直到第四個println,而後打印「3」。
至此,構建腳本自己已完成對構建環境的配置。下一步是執行命令行中指定的全部任務,在本例中爲howdy任務。code

這是task.doLast{}執行塊的地方,所以您會在輸出中看到「Howdy」字樣。繼承

doLast是該塊的別稱;它的真正含義是相似於「任務操做」,而外部塊是任務配置。文檔

task howdy {  
    // 始終在初始構建腳本配置期間執行
    doLast {  
        // 僅在任務自己被調用時執行 
    }
    // 始終在初始構建腳本配置期間執行
}

使用Graovy DSL根據Gradle文檔定義任務的各類方法以下:get

task taskName
task taskName { configure closure }
task taskName(type: SomeType)
task taskName(type: SomeType) { configure closure }

只是爲了錘鍊,在運行構建腳本時當即執行「配置閉包」,而在doLast專門執行任務時執行在配置閉包中定義的閉包。產品

將第二個自定義任務添加到build.gradle文件:

task partner {  
    println "4" 
    doLast {  
        println "Partner" 
    }  
}  
println "5"

若是您./gradlew partner看到的是:

> Configure project :
1
2
3
4
5
 
> Task :partner
Partner

若是您但願一個自定義任務依賴另外一個任務怎麼辦?這簡單。build.gradle 在定義兩個自定義任務以後,將如下行添加到文件中的某處。

partner.dependsOn howdy

並運行:./gradlew partner

...
> Task :howdy
Howdy
 
> Task :partner
Partner

您也可使用task屬性表示相似的關係finalizedBy。若是將dependsOn行替換爲:

howdy.finalizedBy partner

並運行:/gradlew howdy。

...
> Task :howdy
Howdy
 
> Task :partner
Partner

您獲得相同的輸出。固然,他們表達不一樣的關係。

關於任務的最後一點:在實踐中,您不多編寫自定義任務來講諸如「Howdy Partner」之類的東西(我很難相信,我知道)。實際上,一般您會覆蓋已經定義的任務類型。例如,Gradle定義了Copy一個將文件從一個位置複製到另外一個位置的任務。

這是一個將文檔複製到構建目標的示例:

task copyDocs(type: Copy) {
    from 'src/main/doc'
    into 'build/target/doc'
}

當您意識到build.gradle文件其實是一個Groovy腳本時,就可使用Groovy和Gradle的真正功能,若是須要,您能夠執行任意代碼來過濾和轉換這些文件。

下面的任務轉換每一個副本文件並排除.DS_Store文件。DSL很是靈活。您可使用from和多個塊excludes,也能夠執行諸如重命名文件或專門包含文件之類的操做。再次查看「複製」任務的文檔以獲取更完整的想法。

task copyDocs(type: Copy) {
    from 'src/main/doc'
    into 'build/target/doc'
    eachFile { file ->
        doSomething(file);
    }
    exclude '**/.DS_Store'
}

我在Gradle Jar或中最重視War的任務是負責打包.jar.war文件以進行最終分發的任務。像Copy任務同樣,他們具備定製過程的很是開放的能力,這對於須要定製最終產品的項目多是巨大的幫助。實際上,您可使用Gradle DSL來徹底控制打包過程的各個方面。

Spring Boot插件的bootJarbootWar任務繼承自JarWar任務,所以它們包括全部配置選項,包括複製,過濾和修改文件的能力以及自定義清單的能力。

提升篇到此結束,你們要是有興趣歡迎去Gradle官網查看API文檔,很是有幫助。

相關文章
相關標籤/搜索