Gradle 的文件操作

衆所周知,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

任務

  1. 拷貝src/web目錄到build/web目錄,並且拷貝src/docs目錄下的所有 txt 文件到build/web/help下。
  2. 打包build/web目錄下除 images 文件夾外的所有文件爲web.zip,並將web.zip放置於build目錄下。
  3. 解壓build/web.zipbuild/exploded
  4. 刪除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簡化版。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章