Gradle 2.5が継続的ビルドをサポート

今月発表されたGradle 2.5には,継続的ビルド(Continuous Builds)や依存関係置換ルール(Dependency Substitution Rules),進捗イベント(Progress Events),Google Testなど,多数のインキュベーション機能が含まれている。

継続的ビルド

Gradle 2.5で導入された最も興味深い機能は,継続的ビルドのサポートだ。-continuousあるいは-tスイッチを指定して起動されると,Gradleはビルドを実行した後も,メインソースコードあるいはテストの変更を監視する。変更が見つかると,同じビルドを自動的に実行する仕組みだ。プロジェクトのソースコードが改変された場合は,再コンパイルと テストを実行する。テストソースが変更された場合は,テストをコンパイルした上で再度実行する。 影響を受けたタスクのみが実行される。ビルドスクリプトの変更では自動ビルドが実行されないので,変更したスクリプトを考慮して,手動でビルドコマンドを実行する必要がある。将来的には,リモートリポジトリも継続的ビルドプロセスの対象となる予定だ。

ただし,いくつかの制限がある。ビルドの構成フェーズ中に読み込まれるファイルの変更は,ビルドの起動条件にはならない。また,ファイルシステムの変更監視にWatchServiceを使用しているため,実行にはJDK 1.7以降が必要だ。Mac OS X用のGradleはOSのファイルシステムをポーリングする仕組みのため,効率上の問題が考えられるとともに,多数のファイルを監視する場合にはデッドロックが発生する可能性がある。ターゲットとするディレクトリのシンボリックリンクへのファイル生成,ディレクトリのシンボリックの生成および削除,ターゲットのシンボリックリンクの変更および削除は,ビルドの起動条件にはならない。

依存関係置換ルール

依存関係置換ルールは,プロジェクトへの依存関係を,ユーザガイドから引用した下記のコード例のように外部モジュールで置き換えるものだ。

resolutionStrategy.dependencySubstitution {
  substitute project(":api") with module("org.utils:api:1.3")
}

依存対象をビルドする代わりに,外部リポジトリからダウンロードすることが可能になるため,複数プロジェクトのビルド時間を短縮する上で有効である。

上記の例とは逆に,外部モジュールをローカルプロジェクトに置換する定義も可能だ。テスト目的で,依存対象のローカルバージョンをビルドしたい場合などに利用できるだろう。置換ルールでは,バージョンを指定することも,しないことも可能だ。

resolutionStrategy.dependencySubstitution {
  substitute module("org.utils:api") with project(":api")
  substitute module("org.utils:util:2.5") with project(":util")
}

進捗イベント

addProgressListener(ProgressListener)メソッドを使用して,タスクグラフ生成時,タスクの実行開始および停止時,テストの実行開始および停止時など,さまざまなビルドイベントのリスナを登録することができる。

Google Test

Google Testのコンパイルや実行に関して,基本的なサポートを提供するプラグインが用意されている。将来的にはHTMLレポートの改善,テスト実行のリアルタイムなフィードバック,他のテストフレームワークのサポートなどが計画されている。

その他

その他の新機能には,デフォルトの依存関係の単純化,コンパイル済ヘッダのサポート,管理モデルの改良などがある。非推奨とされた機能や,修正された問題点も数多くある。潜在的な非互換変更も少なくない。