Gradle Wrapper をカスタムしてみる

今年も残りわずかとなりましたが、今年最初となるエントリーは『 G*アドベントカレンダー 2014』の第24日目の記事です。

早いもので Gradle をはじめてから、まもなく4年が経とうとしています。 今年は長年の悲願であった業務への導入にも成功し、非常に充実した一年になりました。

そこで今回は業務で実際に使ってみて、とっても便利だった機能の一つ 『カスタム Gradle Wrapper』 (実は正式名は不明...) を紹介したいと思います。

いくつものプロジェクトで Gradle を使っていると、いつもお決まりの Gradle スクリプトを書いていることに気づき、いくら Ant や Maven よりも記述量が少なくて済むとはいえ、ちょっと気が滅入る?ことがありますよね...

例えば、Java のエンコーディングを UTF-8 にする場合

tasks.withType(JavaCompile) {
    options.encoding = 'UTF-8'
}
のようなスクリプトをプロジェクトが立ち上がる度に build.gradle に書かないといけないんです。 これだけならまだしも、こんなのがたくさんあると...

と言うことで…
こんなときは、Gradle Wrapper ディストリビューション(gradlew を実行すると勝手にダウンロードされる Gradle)に『init スクリプト』を組み合わせたカスタムディストリビューションを作ってしまいましょう。

ちなみに『init スクリプト』は build.gradle を実行する前に、予め所定のディレクトリに配置しておいた Gradle スクリプトを実行してくれるという便利な機能です。(詳細はこちら)
『Gradle Wrapper』と組み合わせて使う場合は Gradle Wrapper ディストリビューションの init.d 配下に実行したい『init スクリプト』を配置しておくだけで OK です。

では、早速、Javaのエンコーディングを UTF-8 に変更したカスタムディストリビューションを作成してみましょう。

まず、以下の URL から Gradle Wrapper ディストリビューションの ZIP ファイルをダウンロードして、適当な場所に解凍します。

http://services.gradle.org/distributions/gradle-2.2.1-bin.zip

バージョン番号は 使用したいモノに合わせて変更してください。
今回使用するバージョンは 最新版の 2.2.1 です。

ZIP ファイルを解凍すると

gradle-2.2.1
|-- bin/
|-- init.d/
|-- lib/
|-- media/
|-- LICENSE
|-- NOTICE
|-- changelog.txt
`-- getting-started.html
のような構成になってます。

次に、解凍したディレクトリ直下の init.d 配下に

allprojects {
    tasks.withType(JavaCompile) {
        options.encoding = 'UTF-8'
    }
}
のように記述した Gradle ファイル(ベース名は任意)を作成します。
今回は コンパイルについての設定を記述した Gradle ファイルなので compile.gradle としておきます。
ちなみに init.d 配下に配置した Gradle ファイルは辞書順で実行されるようなので、複数ファイルを作成する場合は実行したい順番になるようにいい感じでファイル名を付けましょう。

最後に、もう一度 ZIP ファイルにアーカイブしなおせば、カスタムディストリビューションの出来上がりです。
作成した ZIP ファイルは どこかダウンロード可能な場所に置いておきましょう。

あとは カスタムディストリビューションを使いたいプロジェクトの build.gradle に

wrapper {
    distributionUrl = 'http://xxx.xxx.xxx/xxxx/gradle-2.2.1-xx.zip'
}
のように ZIPファイルのダウンロードURLを指定して、いつものように
gradle wrapper
を実行するだけです。 もちろん、作成されたファイルは VCS にコミットしておきましょう。 これで 各プロジェクトの build.gradle に
tasks.withType(JavaCompile) {
    options.encoding = 'UTF-8'
}
のようなお決まりのスクリプトを記述しなくても、
./gradlew build
で UTF-8 で書かれた Java ファイルをコンパイルできるようになるんです。

どうですか?
たったこれだけで いつも何も考えずに書いていた お決まりの Gradle スクリプトから解放されるなんて便利じゃないですか?
もし、みなさんも日頃同じような悩みをかかえているようでしたら、ぜひお試しください。

明日はいよいよ大トリの touchez_du_bois さんです。
それでは、みなさん良いクリスマスを!!