Gradle は Make・Ant・Maven の良いとこ取り

今更ですが Gradle について...
Gradle は Make, Ant, Maven につぐ 第4 のビルドツールです。
他のビルドツールからの移行を始めているプロジェクトもかなり増えており、最近 注目されているツールの一つです。

Gradle の特徴を簡単に言ってしまうと、

  • Make のようにスクリプトでなんでも書ける柔軟さ
  • Ant タスクとタイプ
  • Maven の規約と高度な依存解決
を全て備えたビルドツールです。
はっきり言ってしまえば、Make と Ant と Maven の良いとこ取りしただけなので、それほど目新しさはありません。
しかし、その分 3つのツールの良いところだけをうまく融合させていて 非常に使い易いツールになっていると思います。

私が特に気に入っているところは、Ant タスクやタイプがそのまま使えるところです。
中でも FileSet や Selector が利用できるのはかなり強力だと思います。
Gradle では スクリプトとして Groovy が利用できますが、残念ながら Make で使えるシェルスクリプトほど ファイル操作が得意ではありません。
しかし、Ant タスクやタイプを使えば それを十分に補うことができるのです。
例えば...

  1. あるファイル ${projectDir}/A.txt を中間ファイル ${buildDir}/tmp/A.tmp にコピーして 何らかの文字列操作を行う。
  2. 中間ファイル ${buildDir}/tmp/A.tmp からアーカイブ ${distsDir}/A.zip を生成する。
  3. 中間ファイル ${buildDir}/tmp/A.tmp を削除する。
といった処理を 再度行う場合 A.txt の更新時刻が アーカイブ A.zip より新しい場合のみ A.tmp にコピーして処理するのが普通です。
このような処理を Gradle と Groovy だけで実現するのはちょっと面倒ですが、Ant の FileSet も合わせて使えば
task(type: Copy) {
    into "${buildDir}/tmp"
    from ant.path {
        fileset(dir: "${projectDir}", includes: "A.txt") {
            depend(targetdir: "${distsDir}") {
                mapper(type: "merge", to: "A.zip")
            }
        }
    }.list()
    rename "(.*)\.txt" "$1.tmp"
}
といったように簡単に 実現できるのです。
パッと見、どこが Gradle の機能で、どこが Groovy のコードで、どこが Ant のタイプなのか わからないくらい融合されています。
それぞれの得意とするところを理解して使えば きっと強い見方になってくれると思います。
また、Ant タスクやタイプがそのまま利用できることで、Ant からの移行も比較的スムーズにできるのではないでしょうか。
今まで育ててきた build.xml は捨てることになりますが、今まで培ってきた知識は何一つ捨てる必要はありません。