Upload
takuma-watabiki
View
5.676
Download
1
Embed Size (px)
DESCRIPTION
2014/4/30 JJUGナイトセミナーでの資料です。
Citation preview
2014.04.30綿引琢磨(@bikisuke)
http://d.hatena.ne.jp/bikisuke/[email protected]
2時間で分かる!次世代ビルドツールの本命Gradleの全貌 ~基礎編~
2
自己紹介 綿引 琢磨(わたびき たくま)
Twitter: @bikisuke https://www.facebook.com/takuma.watabiki.3
株式会社デライトテクノロジーズ代表取締役 日本Grails/Groovyユーザーグループ運営委員
最近興味を持っているもの Spring Boot / TERASOLUNA Global Framework もちろんG* (ry
Gradle本(執筆中)
基礎編 目次 Gradleの基礎
Gradleのアーキテクチャ Gradleの三大要素
Java プロジェクト with Gradle Java プロジェクトの生成 Java プラグインによるビルド
マルチプロジェクト with Gradle マルチプロジェクトへの適用 ビルドスクリプトの定義
3
Gradle のアーキテクチャ 自動化のための基盤とプラグイン機構による粗結合な構造 自動化のためのインフラとドメインオブジェクト群
基盤だけでは何も出来ないに等しい 直感的なドメインオブジェクトAPI
強力なプラグイン機構 標準的な機能も全てがプラグイン シンプルなインタフェースで追加が容易 既存のプラグインの拡張や統合も可能
5
Gradle のアーキテクチャ
6
Java
JVM
Groovy OSS ライブラリ
Gradle コアライブラリ
Gradle 標準プラグイン
サードパーティ/オレオレ プラグイン
ビルドスクリプト
Gradle
Gradleの三大要素 プロジェクト
処理対象を表すコアドメイン 必ず1つ以上のプロジェクトが存在
タスク 作業単位を表すコアドメイン ユーザーが実行できる最小単位
プラグイン 特定処理のための機能コンポーネント タスク、プロパティ、規約などをパッケージング
7
apply plugin: 'java'
repositories { mavenCentral()}
dependencies { testCompile 'junit:junit:4.11'} task myTest(type:Test) << { println 'myTest task executed.'}
DSLとドメインオブジェクトの関係
8
ビルドスクリプトに定義した内容が、処理対象のProjectオブジェクトとなる
apply plugin: 'java'
repositories { mavenCentral()}
dependencies { testCompile 'junit:junit:4.11'} task myTest(type:Test) << { println 'myTest task executed.'}
DSLとドメインオブジェクトの関係
9
JavaPluginが適用されることで、Javaのビルドに必要な機能がProjectに追加される
apply plugin: 'java'
repositories { mavenCentral()}
dependencies { testCompile 'junit:junit:4.11'} task myTest(type:Test) << { println 'myTest task executed.'}
DSLとドメインオブジェクトの関係
10
JavaPluginにより追加されたTestタスクを拡張
Javaプロジェクトの生成 init タスク(Build Init プラグイン)
指定された初期化タイプの雛形を生成 basic : ビルドスクリプト、Gradleラッパーを生成 pom : pom.xmlを基にビルドスクリプト、Gradleラッパーを生成 java-library : basic + Java規約ディレクトリ生成 groovy-library : basic + Groovy規約ディレクトリ生成 scala-library : basic + Scala規約ディレクトリ生成
※ 現在試験的なステータスの機能です
12
gradle init --type <初期化タイプ>
Javaプラグインによるビルド Java プラグインとは
Javaプロジェクトのコンパイル、テスト、アーカイブに必要なタスク、プロパティ、規約などを提供 ソースセット: src/main/java, src/main/resources,
src/test/java, src/test/resources タスク: clean, compileJava, test, jar など プロパティ: sourceSets, sourceCompatibility,
reportsDir, testReportDir, archivesBaseName など
13
Javaのビルドでよく使用するプロパティ
23
タスク プロパティ 用途
compileJava/compileTestJava options
エンコーディングやブートクラスパスなどのコンパイルオプションを追加する際に使用
jar archiveName JARファイル名を設定する際に使用
test
minHeapSize テストプロセスに-Xmsを設定する際に使用
test maxHeapSize テストプロセスに-Xmxを設定する際に使用test
jvmArgs ヒープ以外のJVMパラメータを設定する際に使用
- sourceCompatibility コンパイル時に使用するJavaのバージョン
- targetCompatibility クラス生成時のターゲットとするJavaのバージョン
apply plugin: 'java' :def defaultEncoding = 'UTF-8'[compileJava, compileTestJava]*.options*.encoding = defaultEncoding
sourceCompatibility = 1.7targetCompatibility = 1.7
jar { archiveName = 'jjug-night-seminar'}
test { minHeapSize = '512m' maxHeapSize = '512m' jvmArgs '-XX:MaxPermSize=256m'}
ビルドスクリプトでの設定例
24
マルチプロジェクトへの適用 基点となるルートプロジェクトに、サブプロジェクトがツリー構造を成す デフォルトではsettings.gradleが配置されたディレクトリがルートプロジェクトとなる
settings.gradleにサブプロジェクト構成を定義 Gradleがサポートするレイアウトは以下の2つ
階層レイアウト フラットレイアウト
26
マルチプロジェクトへの適用 階層レイアウト
階層的な構造のプロジェクトで構成される
settings.gradle
27
include ‘jonathan’, ‘george’, ‘joseph’
<ROOT_PROJECT> ├ jonathan ├ george ├ joseph ! ├ settings.gradle " build.gradle
マルチプロジェクトへの適用 フラットレイアウト
同一階層のプロジェクトで構成される
settings.gradle
28
includeFlat ‘giorno’, ‘bucciarati’, ‘mista’
<WORKSPACE> ├ <ROOT_PROJECT> ! ├ settings.gradle ! " build.gradle ├ giorno ├ bucciarati " mista
レイアウトの特徴 レイアウトはルートプロジェクトとサブプロジェクトの位置関係で決まる ルートプロジェクトがサブプロジェクトの上位階層
階層レイアウト ルートプロジェクトとサブプロジェクトが同一階層
フラットレイアウト レイアウトはプロジェクト単位のため、組み合わせることも可能
29
ビルドスクリプトの定義 ルートプロジェクトに集約
30
subprojects { task showName << { println “$project.name” }}
project(‘:jonathan’) { dependencies { compile project(‘: george’) }}
project(‘:george’) { dependencies { compile project(‘: joseph’) }}
project(‘:joseph’) {}
ビルドスクリプトの定義 ルートプロジェクトに共通設定&差分個別
31
subprojects { task showName() << { println “$name” }}
root/build.gradle
project(‘:jonathan’) { dependencies { compile project(‘:george’) }}
jonathan/build.gradle
project(‘:george’) { dependencies { compile project(‘: joseph’) }}
george/build.gradle
ビルドスクリプトの定義 個別に定義
32
task showName() << { println “$name” }joseph/build.gradle
dependencies { compile project(‘:george’) }
task showName() << { println “$name” }
jonathan/build.gradle
dependencies { compile project(‘: joseph’) }
task showName() << { println “$name” }
george/build.gradle
マルチプロジェクトの勘所 レイアウトについて
特定のシステムやサービスの中で使用することが明らかな場合は階層レイアウトが良い
他システムでも使用するもの、汎用的なライブラリはフラットレイアウトもしくは単一のプロジェクトとしておいた方が柔軟に対応できる
33
マルチプロジェクトの勘所 ビルドスクリプトについて
基本はルートプロジェクトに共通設定を定義して、差分を個別のサブプロジェクトに定義するのが定石
サブプロジェクトの数が少ない場合や、選任のビルド職人がいる場合は、ルートプロジェクトに集約すると効率が良いかも
複数ベンダーで開発するような場合は、個別に定義した方が平和に治まることもある
34