Gradle – 發揮 gradle 100% 能力

要發揮 gradle 100% 的能力, 除了瞭解 gradle DSL & API, Ant Tasks 外, 最根本的還是在於 java/groovy.

今天遇到一個情形, 就是需要在使用 gradle build 時, 指定 build version.  可不僅僅是指定 project.version 那麼簡單就完事了:

  1. output file name 需要有 version, 這個簡單, gradle 搞定.
  2. manifest 要指定 version, 這個也還好, gradle  也有提供解決方式.
  3. 特殊的 file, 例如需要將 version 寫入特定的 xml 檔案.

對個人而言, 由於我對 groovy 的 xml 操作算熟悉, xml parsing 容易, 不過這需要取出特定的 xml file, 我在 get file 上遇到了問題.

由於這是 build process 的需求, 不能變更 source xml file, 因此在 SourceSet 裡找到了 getClassesDir(). 不過一時之間居然不知道怎麼由這個 dir 取得 file list. 找了許久的 gradle DSL & API 也沒有試出來, 真是慚愧…

最後終於找到解法了…其實 groovy 真的提供了很多簡易的寫法, 都超級簡單.

// way 1: call listFiles() to get all files
project.sourceSets.main.classesDir.listFiles().each{ File file ->
   // do something
}
// way 2: call eachFileMatch(pattern, closure) to get file
project.sourceSets.main.classesDir.eachFileMatch(~/.*\.xml/) { File file ->
   // do something
}

上述的 sample 裡, method listFiles 是 Java 方法, 傳回一個 Array(File), 因此呼叫 each 來逐一處理.
而 method eachFileMatch 是 Groovy 方法, 傳入二個參數, 第一個是 regular expression, 第二個是 closure.
細節還是需要看 API document.

補充一點, 上述範例使用 main.classesDir 是因為不希望在 build 的過程中改變 resource file, 若是希望直接變更 resource file, 可以這樣:

project.sourceSets.main.resources.each{ File file ->
   // do something
}

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s