35
2014.04.30 綿引琢磨(@bikisuke) http://d.hatena.ne.jp/bikisuke/ [email protected] 2時間で分かる! 次世代ビルドツールの本命Gradleの 全貌 ~基礎編~

Jjug 20140430 gradle_basic

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

4

Gradleの基礎

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タスクを拡張

11

Javaプロジェクトwith Gradle

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

ビルドのタスクグラフ

14

ビルドのタスクグラフ

15

gradle build

ビルドのタスクグラフ

16

src/main/java配下のjavaコードをコンパイルし、$buildDir/classes/

mainに出力

ビルドのタスクグラフ

17

src/main/resoueces配下のファイルを$buildDir/resources/

mainにコピー

ビルドのタスクグラフ

18

src/test/java配下のjavaコードをコンパイルし、$buildDir/classes/

testに出力

ビルドのタスクグラフ

19

src/test/resoueces配下のファイルを$buildDir/resources/testに

コピー

ビルドのタスクグラフ

20

$buildDir/libsにJARファイルを生成

ビルドのタスクグラフ

21

JUnit(xUnit)/TestNGを実行

ビルドのタスクグラフ

22

BUILD SUCCESS!

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

25

マルチプロジェクトwith Gradle

マルチプロジェクトへの適用 基点となるルートプロジェクトに、サブプロジェクトがツリー構造を成す デフォルトでは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

以上、基礎編でした

35

休憩の後は ~発展編~ をお楽しみください