Gradle+Groovy提高篇


創建自定義任務

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

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

這將演示有關Gradle腳本如何工作的一些信息。使用以下命令運行它:

./gradlew howdy

您將看到(省略了一些多余的行):

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

在這里,Configure project任務將生成並運行生成腳本。在Gradle執行Configure project任務時,它會執行以下操作:

它打第一個println並打印“1”
它找到要執行的howdy任務定義塊,一個閉包,並顯示“2”。請注意,它不會執行doLast關閉操作,因此尚未打印“Howdy”。
它繼續執行腳本,直到第四個println,然后打印“3”。
至此,構建腳本本身已完成對構建環境的配置。下一步是執行命令行中指定的所有任務,在本例中為howdy任務。

這是task.doLast{}執行塊的地方,因此您會在輸出中看到“Howdy”字樣。

doLast是該塊的別稱;它的真正含義是類似於“任務操作”,而外部塊是任務配置。

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

使用Graovy DSL根據Gradle文檔定義任務的各種方法如下:

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文檔,非常有幫助。


技術類文章精選

非技術文章精選


免責聲明!

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



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