衆所周知,Gradle 作爲一個項目構建工具,使用了 Groovy 語言來表述其腳本代碼,而 Groovy 語言中的很多特性設計的有點“反人類”,這些特性對於老手來說寫起來非常舒服,但是對於新手就很不友好了,因爲不便於理解,很多萌新看着 Gradle 的腳本感覺很簡單很清晰的樣子,但是真到了自己去寫的時候就會感覺無從下手,怎麼寫怎麼報錯;本文就從Gradle 的幾個簡單的文件操作順帶來分析一下這些奇葩的坑點,讓大家對 Groovy 語法特性有個大致認知。
準備一個文件目錄如下:點擊下載
image.png
準確的Tree結構:
root │ build.gradle │ solution.gradle │ └──src ├──docs │ aa.aa │ install.md │ install.txt │ readme.txt │ └──web │ index.html │ └──images cat.jpg dog.jpg
任務
- 拷貝
src/web
目錄到build/web
目錄,並且拷貝src/docs
目錄下的所有 txt 文件到build/web/help
下。 - 打包
build/web
目錄下除 images 文件夾外的所有文件爲web.zip
,並將web.zip
放置於build
目錄下。 - 解壓
build/web.zip
到build/exploded
- 刪除
build/web/help
解決方案
//1.Copy task copyWeb(type:Copy){ from 'src/web' from ('src/docs'){ include '*.txt' into 'help' } into 'build/web' } //2.Zip task bundleWeb(type:Zip,dependsOn:copyWeb){ baseName 'web' destinationDir file('build') from 'build/web' exclude 'images/**' } //3.UnZip task unpackBundle(type:Copy,dependsOn:bundleWeb){ from zipTree('build/web.zip') into 'build/exploded' } //4.Delete task deleteHelp(type:Delete,dependsOn:copyWeb){ delete 'build/web/help' }
是的你沒有看錯,任務中的4個問題就用上面這20幾行代碼輕鬆解決;但是,你可能還是不太清楚這些這些配置的規則,它們看上去就像一堆鍵值對類似於Json,然而實際上它們都是由屬性和方法構成的,就像Java一樣:
屬性 | 描述 | 類型 |
---|---|---|
excludes | 排除模式集合 | Set<String> |
includes | 包含模式集合 | Set<String> |
baseName | 文件的基本名稱 | String |
destinationDir | 文件生成的目錄 | File |
方法 | 描述 | 返回 |
---|---|---|
from(sourcePaths) | 指定副本的源文件或目錄 | AbstractCopyTask |
include(includes) | 指定包含模式 | AbstractCopyTask |
exclude(excludes) | 指定排除模式 | AbstractCopyTask |
into(destDir) | 指定副本的目標目錄 | AbstractCopyTask |
所以上面解決方案的完整寫法:
//1.Copy task copyWeb(type:Copy){ from('src/web') from('src/docs'){ include('*.txt') into('help') } into('build/web') } //2.Zip task bundleWeb(type:Zip,dependsOn:copyWeb){ baseName='web' destinationDir=file('build') from('build/web') exclude('images/**') } //3.UnZip task unpackBundle(type:Copy,dependsOn:bundleWeb){ from(zipTree('build/web.zip')) into('build/exploded') } //4.Delete task deleteHelp(type:Delete,dependsOn:copyWeb){ delete('build/web/help') }
這樣看起來就清晰多了,以上腳本中用到的所有方法及屬性都可以在 Gradle DSL Reference 文檔中查到,該文檔詳盡的解釋了每個方法及參數的作用,由於 Groovy 語言的特性,一般 Gradle 腳本都會使用簡寫的方式,也就是省略掉‘()
’、‘=
’等符號,因爲省略掉這些符號不會影響到語法歧義,說到歧義大家可以看到 3.UnZip 中有一行代碼 from(zipTree('build/web.zip'))
即使簡寫也只能寫成 from zipTree('build/web.zip')
而非 from zipTree 'build/web.zip'
,因爲最後這種寫法顯然使 Groovy 無法理解你要將 'build/web.zip'
作爲 zipTree
的參數還是 from
的參數
其實在任何一種計算機語言中各種‘()
’、‘[]
’、‘{}
’都是爲了避免產生語法歧義,只要你掌握其中規則,知道怎麼寫才能避免歧義使代碼正常運作,再瞭解其特有的語言特性如閉包
、lambda
、委託
等,你就大致掌握了這門語言。現在再來看看 Groovy ,它其實就是一種不需要 public修飾符、類型說明、構造函數以及 ()的 Java簡化版。