SlideShare a Scribd company logo
Gradleどうでしょう 
G*workshop Z sapporo 2014 
2014/09/27
自己紹介 
•綿引 琢磨(わたびき たくま) 
•株式会社デライトテクノロジーズ 
代表取締役 
•日本Grails/Groovyユーザーグループ 
運営委員 
•twitter : @bikisuke
すいません、間に合いませんでした... 
•「Gradle徹底入門(仮)」(翔泳社) 
•@masanobuimai, @nobusue, 
@literalice, @bikisuke の共著 
•Gradle2.0ベース(Gradle2.1トピック有) 
•500ページ超の手頃な鈍器 
•2014年11月刊行予定(たぶん...)
今日は刊行より一足先に 
Gradle徹底入門 
を旅することにします。
とはいえ、、、さすがに 
全部はできないので 
抜粋してお送りします。
本日のアジェンダ 
• スタートアップGradle 
• Javaプロジェクトのビルド 
• Gradleの基礎 
• Gradleでのテスト
スタートアップGradle
Gradleとは 
• OSSのビルドツール 
• 他のビルドツールより優れてる(点が多い) 
• GroovyベースのDSLで柔軟性が高い 
• 拡張しやすいアーキテクチャを採用 
• 最新バージョンは 2.1(2014年9月時点)
なぜGradleなのか? 
• ビルドスクリプトがシンプル 
• プラグインが作りやすい 
• 既存のツールの資産を活用できる 
• Maven Central リポジトリを参照可能 
• いろんな言語に対応(中) 
• Android の公式ビルドツールとして採用 
• ここ最近は C/C++ にも力を入れている
ビルドツール比較 
make Ant Maven Gradle 
ビルド定義 
パラダイム 
強み 
弱み 
スクリプトXML XML スクリプト 
手続き的手続き的規約ベース規約ベース 
非常にコンパクト基本機能がシンプル 
クロスプラットフォーム 
規約による標準化 
依存関係管理 
規約による標準化 
依存関係管理 
高い柔軟性/拡張性 
移植性問題 
依存関係管理なし 
規約無く再利用に難有り 
依存関係管理なし 
定義ファイルの柔軟性 
規約外の場合が困難 
定義ファイルの柔軟性IDE連携にやや難有り
Gradleのインストール 
• 前提条件: JDK6以上 
• Mac/Unix系:GVMが便利 
• http://gvmtool.net/ 
• $ gvm install gradle 
• Windows: 公式サイトからダウンロード 
• http://www.gradle.org/downloads 
• ZIP解凍して、環境変数Pathに 
<GRADLE_HOME>bin
Hello, Gradle! 
// build.gradle 
task hello << { 
println ‘Hello, Gradle!’ 
}
Build Initプラグイン 
を使ってみる(1/2) 
• Gradle標準プラグインのひとつ 
• ビルドプロジェクトの雛形を生成 
• basic: ビルドスクリプト、Gradleラッパーを生成 
• pom: pom.xml からビルドスクリプト、Gradleラッパーを生成 
• java-library: basic + Java規約ディレクトリを生成 
• groovy-library: basic + Groovy規約ディレクトリを生成 
• scala-library: basic + Scala規約ディレクトリを生成
Build Initプラグイン 
を使ってみる(2/2) 
$ gradle init --type java-library 
: 
$ gradle build
Javaプロジェクト 
のビルド
Javaプラグイン 
•Javaプロジェクトのコンパイル、テスト、 
アーカイブに必要なタスク、プロパティ、 
規約などを提供 
• ソースセット: src/main/java, src/main/resources, 
src/test/java, src/test/resources 
• タスク: clean, compileJava, test, jar など 
• プロパティ: sourceSets, sourceCompatibility, 
reportsDir, testReportDir, archivesBaseName など
Javaプラグインのタスク
Javaのビルドでよく使用するプロパティ 
タスクプロパティ用途 
compileJava/ 
compileTestJava options エンコーディングやブートクラスパスなどのコンパ 
イルオプションを追加する際に使用 
jar archiveName JARファイル名を設定する際に使用 
test 
minHeapSize テストプロセスに-Xmsを設定する際に使用 
tteesstt maxHeapSize テストプロセスに-Xmxを設定する際に使用 
jvmArgs ヒープ以外のJVMパラメータを設定する際に使用 
- sourceCompatibility コンパイル時に使用するJavaのバージョン 
- targetCompatibility クラス生成時のターゲットとするJavaのバージョン
Javaプロジェクトの 
ビルドスクリプト定義例 
apply plugin: 'java' // Gradle 2.0 
def defaultEncoding = 'UTF-8' 
[compileJava, compileTestJava]*.options*.encoding = defaultEncoding 
sourceCompatibility = 1.7 
targetCompatibility = 1.7 
jar { 
archiveName = 'gws-sapporo.jar' 
} 
test { 
minHeapSize = '512m' 
maxHeapSize = '512m' 
jvmArgs '-XX:MaxPermSize=256m' 
}
Applicationプラグイン 
を使ってみる(1/2) 
// Gradle 2.1 
plugins { 
id ‘application’ 
} 
mainClassName = 'com.example.Main'
Applicationプラグイン 
を使ってみる(2/2) 
$ gradle run
Gradleの基礎
Gradleのアーキテクチャ 
ビルドスクリプト 
サードパーティ/コミュニティ(野良) プラグイン 
Gradle 標準プラグイン 
Gradle コアライブラリ 
Groovy OSS ライブラリ 
Java 
JavaVM
Gradleのアーキテクチャ 
ビルドスクリプト 
サードパーティ/コミュニティ(野良) プラグイン 
Gradle 標準プラグイン 
Gradle コアライブラリ 
Groovy OSS ライブラリ 
Java 
JavaVM 
Gradle
ビルドの入力情報
ビルドの入力情報
初期化スクリプト 
• ビルドの最初で実行されるGroovyスクリプト 
• 主にユーザー情報や実行環境などの初期設定 
を行うために使用 
• デフォルトは init.gradle 
• -I (--init-script) <FILE_NAME> でもOK
設定スクリプト 
• ビルド対象のプロジェクトの設定を行う 
Groovyスクリプト 
• 主にビルドに参加するプロジェクトを定義す 
る用途で使用 
• デフォルトは settings.gradle 
• -c (--settings-file) <FILE_NAME> でもOK
ビルドスクリプト 
• ビルドの定義を記述するスクリプトファイル 
• ビルド対象がシンプルなものであれば、 
このファイル1つあればOK 
• デフォルトは build.gradle 
• -b (--build-file) <FILE_NAME> でもOK
スクリプトファイルの構成要素 
• ステートメント 
• 変数宣言、プロパティ設定など一般 
的なプログラミングでのそれと同義 
• スクリプトブロック 
• ある設定を行うための領域 
• 実体はただのクロージャで、Gradle 
のドメインオブジェクトに委譲
Gradleのドメインオブジェクト 
•Gradleではビルド処理を行う実行基盤 
とビルド対象をドメインモデルで表現 
•Mavenでいうところの 
Project Object Model みたいなもの 
•例えば... 
•プロジェクト → Projectオブジェクト
Gradleの三大要素 
•Projectオブジェクト(プロジェクト) 
• 処理対象を表すコアドメイン 
• 必ず1つ委譲のプロジェクトが存在する 
•Taskオブジェクト(タスク) 
• 作業単位を表すコアドメイン 
• ユーザーが実行できる最小単位 
•Pluginオブジェクト(プラグイン) 
• 特定処理のための機能コンポーネント 
• タスク、プロパティ、規約などをパッケージング
DSLとドメインオブジェクトの関係 
apply plugin: 'java' 
repositories { 
jcenter() 
} 
dependencies { 
testCompile 'junit:junit:4.11' 
} 
task myTest(type:Test) << { 
println '俺のテストタスクを実行したった。' 
}
DSLとドメインオブジェクトの関係 
apply plugin: 'java' 
repositories { 
jcenter() 
} 
dependencies { 
testCompile 'junit:junit:4.11' 
} 
task myTest(type:Test) << { 
println '俺のテストタスクを実行したった。' 
} 
Projectオブジェクト
DSLとドメインオブジェクトの関係 
JavaPlugin 
オブジェクト 
apply plugin: 'java' 
repositories { 
jcenter() 
} 
dependencies { 
testCompile 'junit:junit:4.11' 
} 
task myTest(type:Test) << { 
println '俺のテストタスクを実行したった。' 
}
DSLとドメインオブジェクトの関係 
apply plugin: 'java' 
repositories { 
jcenter() 
} 
dependencies { 
testCompile 'junit:junit:4.11' 
} 
task myTest(type:Test) << { 
println '俺のテストタスクを実行したった。' 
} 
JavaPlugin 
のTestタスクを拡張
タスクの記述方法いろいろ 
task showDescription << { 
println description 
} 
showDescription.description = 'showDescriptionタスクです。' 
task showDescription { 
description = 'showDescriptionタスクです。' 
doLast { 
println description 
} 
} 
task showDescription(description: 'showDescriptionタスクです。') << { 
println description 
}
Gradleでのテスト
Gradleでできること 
• JUnit/TestNGのテスト実行 
• 特定のテストだけ実行 
• テストの並列実行 
• etc.
JUnit/TestNGのテスト実行 
• JUnit 
• Javaプラグインを適用すると 
デフォルトで使用可能 
• TestNG 
• test ブロックに useTestNG() と 
書くことで使用可能になる
特定のテストだけ実行 
test { 
filter { 
// 特定のパッケージのテストだけを実行 
includeTestsMatching "com.example.*" 
// クラスのサフィックスが一致するものだけを実行 
includeTestsMatching "*IT" 
} 
}
テストの並列実行 
// 利用可能なプロセッサー数を取得 
def processNumber = 
Runtime.runtime.availableProcessors() 
test { 
maxParallelForks = processNumber - 2 
}
以上、抜粋でお送りし 
ましたが、Gradleには 
もっといろいろな機能や 
仕組みがあります。
今日説明してないこと 
依存関係管理 
カスタムプラグインの作成 
IDE連携アーカイブの作成Jenkins連携 
Androidプロジェクトでの適用 
アーティファクトの公開 
独自Gradleの作成 
カスタムタスクのAnt/Mavenからの移行 
作成 
プラグインポータル 
マルチプロジェクト
ということで、刊行の暁 
には、是非とも一読 
いただきたく存じます。
ご清聴ありがとう 
ございました。

More Related Content

Gradleどうでしょう