36
2014.04.30 須江信洋(@nobusue) http://d.hatena.ne.jp/nobusue https://www.facebook.com/nobuhiro.sue 2時間で分かる! 次世代ビルドツールの本命 Gradleの全貌 導入編~

Jjug 20140430 gradle_intro

Embed Size (px)

Citation preview

Page 1: Jjug 20140430 gradle_intro

2014.04.30

須江信洋(@nobusue)

http://d.hatena.ne.jp/nobusue

https://www.facebook.com/nobuhiro.sue

2時間で分かる! 次世代ビルドツールの本命Gradleの全貌 ~導入編~

Page 2: Jjug 20140430 gradle_intro

2

自己紹介

須江 信洋(すえ のぶひろ) Twitter: @nobusue

https://www.facebook.com/nobuhiro.sue

約10年ほどJavaEE関連の仕事をしてます

2013年10月よりフリーランス(個人事業主)

最近興味を持っているもの Vert.x / Storm / Camel / Elasticsearch

Vagrant / Docker / Ansible / Serverspec

もちろんGroovy / Gradle / Grails Gradle本 (執筆中)

Page 3: Jjug 20140430 gradle_intro

3

JGGUGって? Japan Grails/Groovy User Group 2009年発足 Grails/GroovyなどのGroovyエコシステム(G*)に関するコミュニティ

2006年から活動していたGrailsコミュニティが前身

毎月第3金曜日にG*ワークショップZを開催 参加型(ハンズオンなど) 告知・申し込みはこちら http://jggug.doorkeeper.jp/

http://www.jggug.org/

Page 4: Jjug 20140430 gradle_intro

導入編 目次

Gradle概要 Gradleとは?

Ant/Mavenとの差別化ポイント

Gradleの普及状況

Gradleの利用方法 インストール

Hello Gradle

参考情報

4

Page 5: Jjug 20140430 gradle_intro

5

Gradle概要

Page 6: Jjug 20140430 gradle_intro

Ant/Mavenの課題を解決する次世代ビルドツール AntとMavenの「いいとこどり」

HibernateやSpringなど、多くのプロジェクトで採用

標準化と柔軟性の両立 Mavenライクな標準ディレクトリ構造を使い、そこから外れる部分は自由にカスタマイズ可能

依存ライブラリはMavenリポジトリでもローカルJARでも好きなように定義できる

マルチプロジェクトへの対応が容易

ビルドスクリプトはGroovyで記述 DSLによるシンプルかつ可読性の高いビルド定義

条件分岐や繰り返しなど、任意の処理をGroovyで実行可能

6

http://gradle.org/

Page 7: Jjug 20140430 gradle_intro

要するにGradleとは?

7

Mavenのように 規約によるビルドで効率的に記述でき、

Antのように

プロジェクト特有の事情に柔軟に対応でき、

Makeのように スクリプトのパワーを活かしたビルドが実現できる

クロスプラットフォーム対応次世代ビルドツール

Page 8: Jjug 20140430 gradle_intro

ビルドツールの進化

8

パラダイム

ビルド定義

スクリプト

XML

手続き的 規約によるビルド

Make

Ant Maven

Gradle

Page 9: Jjug 20140430 gradle_intro

ビルドツールの進化: epoch1

9

パラダイム

ビルド定義

スクリプト

XML

手続き的 規約によるビルド

Make

Ant Maven

Gradle

元祖ビルドツール

Page 10: Jjug 20140430 gradle_intro

ビルドツールの進化: epoch2

10

パラダイム

ビルド定義

スクリプト

XML

手続き的 規約によるビルド

Make

Ant Maven

Gradle

JavaとXMLにより クロスプラットフォーム対応を実現

Page 11: Jjug 20140430 gradle_intro

ビルドツールの進化: epoch3

11

パラダイム

ビルド定義

スクリプト

XML

手続き的 規約によるビルド

Make

Ant Maven

Gradle

ビルドに 「ドメインモデル(POM)」と 「依存性管理」を導入

Page 12: Jjug 20140430 gradle_intro

ビルドツールの進化: epoch4

12

パラダイム

ビルド定義

スクリプト

XML

手続き的 規約によるビルド

Make

Ant Maven

Gradle

ビルドを「言語内DSL」で記述 ドメインモデルをスクリプトで直接操作

Page 13: Jjug 20140430 gradle_intro

Gradleのビルドスクリプト(例)

13

apply plugin: 'java' repositories { mavenCentral() } dependencies { compile ‘org.slf4j:slf4j-api:1.7.5’ testCompile ‘junit:junit:4.11’ }

Javaプラグインを適用

依存性解決に Maven Centralを利用

プロダクトコードの依存ライブラリ

テストコードの依存ライブラリ

Page 14: Jjug 20140430 gradle_intro

Gradle DSL

Gradleが独自に定義する文法 build.gradleで記述する”apply”や

”repositories”、”dependencies”など

Groovyの標準の文法とは異なる

舞台裏 apply / repositories / dependenciesはメソッド

単に引数のカッコを省略しているだけ(Groovyの省略記法を利用)

メソッドのレシーバはGradleが提供するオブジェクト

14

Page 15: Jjug 20140430 gradle_intro

スクリプトの柔軟性: 条件分岐

15

task "OsDependTask" << { def os = System.getProperty("os.name") if(os.contains("Windows")) { //Windows用の処理 } else if(os.contains("Mac OS")) { //Mac OS用の処理 } else { //Linux/Unix用の処理 } }

Javaのクラスが 直接使える

ifやswitchで 分岐が書ける

Page 16: Jjug 20140430 gradle_intro

規約に合わないプロジェクトへの対応

16

├── build │ └── classes │ └── main ├── build.gradle └── src ├── main │ ├── java │ └── webapp │ ├── index.html │ └── WEB-INF │ └── classes └── test └── java

規約: src/main/java ⇒build/classes/main

src/main/webapp/WEB-INF/classes以下にクラスを生成したい

Page 17: Jjug 20140430 gradle_intro

規約に合わないプロジェクトへの対応

以下のようにしてカスタマイズ可能

17

[build.gradle] sourceSets.main.output.classesDir = ‘src/main/webapp/WEB-INF/classes’

Page 18: Jjug 20140430 gradle_intro

マルチプロジェクト

複数プロジェクト(サブプロジェクト)から構成されるプロジェクトのビルドを定義

サブプロジェクト間の依存関係を定義可能 依存関係を考慮してビルドを行う

サブプロジェクトに共通する処理や設定の一元化が可能

Gradleのkiller featureの一つ Hibernate

Gradle自身のビルド

18

⇒詳細は「基礎編」で!

Page 19: Jjug 20140430 gradle_intro

Gradleラッパー

Gradleの個別導入を不要に JDKさえ導入されていれば、Gradleを自動でインストールして実行してくれる仕組み

環境構築の手間を削減し、利用の敷居を下げる

Gradleラッパーは以下の用途で有効 JenkinsなどのCI環境での利用

開発者の環境構築負荷軽減

利用するGradleのバージョン統一

19

Page 20: Jjug 20140430 gradle_intro

Gradleラッパー

20

Gradle導入済の環境で"gradle wrapper"を実行 すると、Gradleのブートストラップが生成される

バージョン管理 システム等

Gradle 未導入環境

“gradlew <task>”を実行すると、 Gradleが自動的に導入される

登録

取得

Gradle バイナリ (zip)

自動DL /

環境設定

Page 21: Jjug 20140430 gradle_intro

g

Gradleデーモン

Gradleのプロセスを常駐し、起動を高速化

起動 gradle --daemon <task>

停止 gradle --stop

デフォルトでdaemonを使う場合 export GRADLE_OPTS=

“-Dorg.gradle.daemon=true”

もしくは gradle.properties に org.gradle.daemon=true を追加

21

Page 22: Jjug 20140430 gradle_intro

AntからGradleへの移行容易性

Gradleは既存のAnt資産を活用できる Antのbuild.xmlをそのまま読み込んで実行可能

AntタスクをGradleから直接利用可能

AntタスクとGradleタスクを共存することも可能

相互に依存するタスクも定義できる

AntタスクをGradleから拡張することもできる

Gradleは「Better Ant」としても使える Mavenとの大きな違い

Antから段階的にGradleへ移行できる

22

⇒詳細は「発展編」で!

Page 23: Jjug 20140430 gradle_intro

Gradleの普及状況

SpringやHibernateなど多数のOSSで採用

23

Page 24: Jjug 20140430 gradle_intro

Androidのビルドに採用

24

http://www.gradleware.com/resources/tech/android

Page 25: Jjug 20140430 gradle_intro

ビルドツール動向

25 http://zeroturnaround.com/rebellabs/java-build-tools-part-2-a-

decision-Makers-comparison-of-maven-gradle-and-ant-ivy/

Page 26: Jjug 20140430 gradle_intro

26

Gradleの利用方法

Page 27: Jjug 20140430 gradle_intro

Gradleインストール 前提 JDK1.5以上 (“java –version”で確認) 現時点では1.8に未対応なので1.7がおすすめ

GVM利用 curl -s get.gvmtool.net | bash gvm install gradle 詳細は http://gvmtool.net/ 参照 (Windowsの場合はCygwinが必要)

ZIPを展開 http://www.gradle.org/downloads 適当なディレクトリに展開 ($GRADLE_HOME) $GRADLE_HOME/bin にパスを通しておく

27

Page 28: Jjug 20140430 gradle_intro

動作確認

gradle -v

28

GVMでインストールした場合は ~/.gvm/gradle/<version> 以下に導入され、

~/.gvm/gradle/current にシンボリックリンクが作成されます

Page 29: Jjug 20140430 gradle_intro

Hello Gradle

適当なディレクトリを作成し、カレントを移動

以下の内容で”build.gradle”を作成

“gradle hello” を実行

29

task hello << { println 'Hello Gradle world!' }

Page 30: Jjug 20140430 gradle_intro

Hello Gradle解説

30

task hello << { println 'Hello Gradle world!' }

タスクの定義 タスクにクロージャを追加 ※ leftShift()の省略記法

Groovyのprintln = JavaのSystem.out.println()

Page 31: Jjug 20140430 gradle_intro

実行可能タスクの確認

gradle tasks

31

Page 32: Jjug 20140430 gradle_intro

32

参考情報

Page 33: Jjug 20140430 gradle_intro

Gradle関連情報

Gradle 日本語ドキュメント http://gradle.monochromeroad.com/docs/index.html

サンプルコード gradle-1.12-all.zipの”samples/”以下

Gradleプロジェクトのソースコード gradle-1.12-src.zip

https://github.com/gradle/gradle

GVM:the Groovy enVironment Manager

http://gvmtool.net/

Groovy/Grails/Gradle/Vert.x/SpringBootなどに対応

33

Page 35: Jjug 20140430 gradle_intro

Gradleロードマップ

2014/4/30時点での最新は1.12

1.xは1.12で最後、次のリリースは2.0 http://forums.gradle.org/gradle/topics/aft

er_1_12_comes_2_0

最近の重点強化点 依存関係管理をより柔軟・緻密に

ビルドのパラレル化

IDE連携強化

ネィティブ(C言語系)ビルド対応

35

Page 36: Jjug 20140430 gradle_intro

以上、導入編でした

36

引き続き 「基礎編」 を お楽しみください