Groovy基礎勉強会:
Gradleの基礎

            2013.03.09
        須江信洋(@nobusue)
                 http://d.hatena.ne.jp/nobusue
        https://www.facebook.com/nobuhiro.sue
自己紹介
       須江 信洋(すえ のぶひろ)
           Twitter: @nobusue
           https://www.facebook.com/nobuhiro.sue
       約10年ほどJavaEE関連の仕事をしてます
       最近はPhoneGap(Cordova)とかがメイン
       G*(Groovy関連技術)との関わり
           JGGUGサポートスタッフ
           「プログラミングGROOVY」執筆チーム
           「Groovy イン・アクション」翻訳チーム
           Groovyで作ったBot飼ってます(@hatena_groovy)

    2
ビルドツールの進化
     パラダイム
             手続き的   規約によるビルド
ビルド定義




    スクリプト    Make    Gradle


    XML      Ant     Maven

3
ビルドツールの進化: epoch1
     パラダイム
                POM(Project規約によるビルド
             手続き的          Object Model)
ビルド定義           ビルドに「ドメインモデル」を導入



    スクリプト    Make            Gradle


    XML       Ant            Maven

4
ビルドツールの進化: epoch2
              Gradle Build Language
     パラダイム
             ビルドを「言語内DSL」で記述
                手続き的             規約によるビルド
          ドメインモデルをGroovyで自由に操作
ビルド定義




    スクリプト       Make           Gradle


    XML          Ant           Maven

5
http://gradle.org/

       Ant/Mavenの課題を解決する次世代ビルドツール
           AntとMavenの「いいとこどり」                 2013/3/9現在
           HibernateやSpringSourceで使われている       最新は1.4
       標準化と柔軟性の両立
           Mavenライクな標準ディレクトリ構造を使い、そこから外れ
            る部分は自由にカスタマイズ可能
           依存ライブラリはMavenリポジトリでもローカルJARでも好
            きなように定義できる
           マルチプロジェクトへの対応が容易
       ビルドスクリプトはGroovyで記述
           DSLによるシンプルかつ可読性の高いビルド定義
           条件分岐や繰り返しなど、任意の処理をGroovyで

    6
Gradleのビルドスクリプト(例)
apply plugin: 'java'     Javaプラグインを適用

repositories {
  mavenCentral()       依存性解決にMavenリポジトリを利用
}
                          プロダクトコードのコンパイル時の依存先
dependencies {
  compile(
      group: 'commons-collections',
      name: 'commons-collections',
      version: '3.2')
  testCompile(                テストコードのコンパイル時の依存先
      group: 'junit',
      name: 'junit',
      version: '4.+')
}
7
OK、「gradle test」を実行だ!




         Mavenと同様の規約に従って
         プロダクトコードとテストコードを
                配置

8
Gradle DSL
   疑問
       build.gradleに書いてある”apply”と
        か”repositories”とか”dependencies”とか何?
       なんかGroovyスクリプトと違くね?
   回答
       applyもrepositoriesもdependenciesも実はメ
        ソッドです(引数のカッコを省略してるだけ)
       Gradleの文法はGroovyの内部DSLとして定義



9
今日のお題: Gradleの基礎
   「基礎とは入門ではない」 by @kyon_mm
       入門編は別の機会に
   Gradleの根幹となる「仕組み」を理解したい
   そのためには、プラグインを作ってみるのが
    早道だと考えます
       プラグインを開発するには、Gradleのドメインモデ
        ルやビルドエンジンの仕組みの理解が不可欠
       とはいえ、時間も限られますので、とっかりとなる
        情報をなめるだけにしておきます

10
Gradle DSLのエントリーポイント
   Gradleビルド言語リファレンス
       http://gradle.monochromeroad.com/docs/
        dsl/index.html




11
Gradleの代表オブジェクト
   org.gradle.api.Project
       ビルドスクリプト(build.gradle)に対応
       中核となるオブジェクト
       ビルドスクリプト内では暗黙的に、もしくはproject
        プロパティで参照




12
Gradleの代表オブジェクト
   org.gradle.api.invocation.Gradle
       実行中のビルドエンジンに対応
       初期化時の情報や、環境情報を保持
       Project.getGradle() で取得可能




13
Gradleの代表オブジェクト
   org.gradle.api.initialization.Settings
       settings.gradleに対応
       マルチプロジェクト構成時にプロジェクト階層の情
        報を保持




14
プラグインへの道(1/2)
   カスタムタスクを作る
    1.   ビルドファイル内にtask{}を作る
    2.   ビルドファイル内にDefaultTaskのサブクラスを
         作る
    3.   カスタムタスクをbuildSrc/に分離する
         ⇒依存関係は自動的に解決される
    4.   スタンドアロンプロジェクトとして分離する
         ⇒参照側からclasspathに追加する必要あり
       テスト支援
        org.gradle.testfixtures.ProjectBuilder
15
プラグインへの道(2/2)
   カスタムプラグインを作る
    1.   ビルドファイル内にPluginインターフェースの実
         装クラスを作る(apply()を実装)
    2.   プラグインをbuildSrc/に分離する
         ⇒依存関係は自動的に解決される
         ⇒マルチプロジェクトの場合はルートに配置
    3.   スタンドアロンプラグインとして分離する
         ⇒参照側は依存関係を追加して、apply plugin
       プラグイン独自プロパティ
        Extension Container(project.extensions)
         にJava Beanを追加し、透過的に参照できる

16
タスクとプラグイン
   タスク
       何らかの「処理」を行うもの
       Antのタスクを想像してもらえばよいです
   プラグイン
       タスク/コンフィグレーション/プロパティ/メソッド/コ
        ンセプトなどの拡張を含むモジュール
         例えばjava-baseプラグインは”sourcesets”と
          いう概念のみを提供し、Javaプラグインがそれを
          利用している
       メタデータ(META-INF/gradle-plugins)を持つ
17
便利メソッド/プロパティ
    file()
        相対/絶対パス、Fileオブジェクト、URLなど
        PathValidationでいろいろ判定可能
    files()
        ファイルのコレクション(filter可能)
        引数としてファイルを返すtaskを渡せる
    fileTree()
        ファイルのツリー階層をトラバース(visit)可能
        Antのpathelement式でinclude/exclude可能
    logger
        SLF4J Loggerのインスタンス
        標準出力への出力はQUIETレベルにリダイレクト
    18
拡張プロパティ
    Gradleのドメインモデルにプロパティを追加する
     際には、extプロパティ(extブロック)を使うこと
        Gradle-1.0M9からこちらが強く推奨されています
        現在は互換性のため未定義のプロパティがあってもエ
         ラーにならないが、警告が出ます
    ローカル変数(def)と異なり、ドメインモデルのラ
     イフサイクル全体で利用できます
    詳細はこちらの「13.4.2. 拡張プロパティ」を参照
        http://gradle.monochromeroad.com/docs/use
         rguide/writing_build_scripts.html

    19
Gradleプラグイン、順調に増殖中
          http://wiki.
           gradle.org
           /display/G
           RADLE/Plu
           gins

20
Gradleと仲良くなるために
   Gradle 日本語ドキュメント(@literaliceさん)
       http://gradle.monochromeroad.com/docs/in
        dex.html
   ビルドツールGradle スタートアップガイドの紹介
       http://www.ntts.co.jp/publish/column/tec/ja
        va_03/index.html
   GVM:the Groovy enVironment Manager
       http://gvmtool.net/
       groovy/grails/gradle/griffon/vert.x

    21
おすすめ書籍
   “Gradle Effective Implementation
    Guide” Hubert Klein Ikkink (mrhaki)
       http://mrhaki.blogspot.de/search/label/Gr
        adle%3AGoodness の人の本です




22
Gradleに入門したい?
   G*ワークショップZ 3/15はGradleハンズオン
    やります。ぜひご参加ください。
       http://jggug.doorkeeper.jp/events/3007




23
ありがとうございました




              http://nekofont.upat.jp/




24

Groovy base gradle_20130309

  • 1.
    Groovy基礎勉強会: Gradleの基礎 2013.03.09 須江信洋(@nobusue) http://d.hatena.ne.jp/nobusue https://www.facebook.com/nobuhiro.sue
  • 2.
    自己紹介  須江 信洋(すえ のぶひろ)  Twitter: @nobusue  https://www.facebook.com/nobuhiro.sue  約10年ほどJavaEE関連の仕事をしてます  最近はPhoneGap(Cordova)とかがメイン  G*(Groovy関連技術)との関わり  JGGUGサポートスタッフ  「プログラミングGROOVY」執筆チーム  「Groovy イン・アクション」翻訳チーム  Groovyで作ったBot飼ってます(@hatena_groovy) 2
  • 3.
    ビルドツールの進化 パラダイム 手続き的 規約によるビルド ビルド定義 スクリプト Make Gradle XML Ant Maven 3
  • 4.
    ビルドツールの進化: epoch1 パラダイム POM(Project規約によるビルド 手続き的 Object Model) ビルド定義 ビルドに「ドメインモデル」を導入 スクリプト Make Gradle XML Ant Maven 4
  • 5.
    ビルドツールの進化: epoch2 Gradle Build Language パラダイム ビルドを「言語内DSL」で記述 手続き的 規約によるビルド ドメインモデルをGroovyで自由に操作 ビルド定義 スクリプト Make Gradle XML Ant Maven 5
  • 6.
    http://gradle.org/  Ant/Mavenの課題を解決する次世代ビルドツール  AntとMavenの「いいとこどり」 2013/3/9現在  HibernateやSpringSourceで使われている 最新は1.4  標準化と柔軟性の両立  Mavenライクな標準ディレクトリ構造を使い、そこから外れ る部分は自由にカスタマイズ可能  依存ライブラリはMavenリポジトリでもローカルJARでも好 きなように定義できる  マルチプロジェクトへの対応が容易  ビルドスクリプトはGroovyで記述  DSLによるシンプルかつ可読性の高いビルド定義  条件分岐や繰り返しなど、任意の処理をGroovyで 6
  • 7.
    Gradleのビルドスクリプト(例) apply plugin: 'java' Javaプラグインを適用 repositories { mavenCentral() 依存性解決にMavenリポジトリを利用 } プロダクトコードのコンパイル時の依存先 dependencies { compile( group: 'commons-collections', name: 'commons-collections', version: '3.2') testCompile( テストコードのコンパイル時の依存先 group: 'junit', name: 'junit', version: '4.+') } 7
  • 8.
    OK、「gradle test」を実行だ! Mavenと同様の規約に従って プロダクトコードとテストコードを 配置 8
  • 9.
    Gradle DSL  疑問  build.gradleに書いてある”apply”と か”repositories”とか”dependencies”とか何?  なんかGroovyスクリプトと違くね?  回答  applyもrepositoriesもdependenciesも実はメ ソッドです(引数のカッコを省略してるだけ)  Gradleの文法はGroovyの内部DSLとして定義 9
  • 10.
    今日のお題: Gradleの基礎  「基礎とは入門ではない」 by @kyon_mm  入門編は別の機会に  Gradleの根幹となる「仕組み」を理解したい  そのためには、プラグインを作ってみるのが 早道だと考えます  プラグインを開発するには、Gradleのドメインモデ ルやビルドエンジンの仕組みの理解が不可欠  とはいえ、時間も限られますので、とっかりとなる 情報をなめるだけにしておきます 10
  • 11.
    Gradle DSLのエントリーポイント  Gradleビルド言語リファレンス  http://gradle.monochromeroad.com/docs/ dsl/index.html 11
  • 12.
    Gradleの代表オブジェクト  org.gradle.api.Project  ビルドスクリプト(build.gradle)に対応  中核となるオブジェクト  ビルドスクリプト内では暗黙的に、もしくはproject プロパティで参照 12
  • 13.
    Gradleの代表オブジェクト  org.gradle.api.invocation.Gradle  実行中のビルドエンジンに対応  初期化時の情報や、環境情報を保持  Project.getGradle() で取得可能 13
  • 14.
    Gradleの代表オブジェクト  org.gradle.api.initialization.Settings  settings.gradleに対応  マルチプロジェクト構成時にプロジェクト階層の情 報を保持 14
  • 15.
    プラグインへの道(1/2)  カスタムタスクを作る 1. ビルドファイル内にtask{}を作る 2. ビルドファイル内にDefaultTaskのサブクラスを 作る 3. カスタムタスクをbuildSrc/に分離する ⇒依存関係は自動的に解決される 4. スタンドアロンプロジェクトとして分離する ⇒参照側からclasspathに追加する必要あり  テスト支援  org.gradle.testfixtures.ProjectBuilder 15
  • 16.
    プラグインへの道(2/2)  カスタムプラグインを作る 1. ビルドファイル内にPluginインターフェースの実 装クラスを作る(apply()を実装) 2. プラグインをbuildSrc/に分離する ⇒依存関係は自動的に解決される ⇒マルチプロジェクトの場合はルートに配置 3. スタンドアロンプラグインとして分離する ⇒参照側は依存関係を追加して、apply plugin  プラグイン独自プロパティ  Extension Container(project.extensions) にJava Beanを追加し、透過的に参照できる 16
  • 17.
    タスクとプラグイン  タスク  何らかの「処理」を行うもの  Antのタスクを想像してもらえばよいです  プラグイン  タスク/コンフィグレーション/プロパティ/メソッド/コ ンセプトなどの拡張を含むモジュール  例えばjava-baseプラグインは”sourcesets”と いう概念のみを提供し、Javaプラグインがそれを 利用している  メタデータ(META-INF/gradle-plugins)を持つ 17
  • 18.
    便利メソッド/プロパティ  file()  相対/絶対パス、Fileオブジェクト、URLなど  PathValidationでいろいろ判定可能  files()  ファイルのコレクション(filter可能)  引数としてファイルを返すtaskを渡せる  fileTree()  ファイルのツリー階層をトラバース(visit)可能  Antのpathelement式でinclude/exclude可能  logger  SLF4J Loggerのインスタンス  標準出力への出力はQUIETレベルにリダイレクト 18
  • 19.
    拡張プロパティ  Gradleのドメインモデルにプロパティを追加する 際には、extプロパティ(extブロック)を使うこと  Gradle-1.0M9からこちらが強く推奨されています  現在は互換性のため未定義のプロパティがあってもエ ラーにならないが、警告が出ます  ローカル変数(def)と異なり、ドメインモデルのラ イフサイクル全体で利用できます  詳細はこちらの「13.4.2. 拡張プロパティ」を参照  http://gradle.monochromeroad.com/docs/use rguide/writing_build_scripts.html 19
  • 20.
    Gradleプラグイン、順調に増殖中 http://wiki. gradle.org /display/G RADLE/Plu gins 20
  • 21.
    Gradleと仲良くなるために  Gradle 日本語ドキュメント(@literaliceさん)  http://gradle.monochromeroad.com/docs/in dex.html  ビルドツールGradle スタートアップガイドの紹介  http://www.ntts.co.jp/publish/column/tec/ja va_03/index.html  GVM:the Groovy enVironment Manager  http://gvmtool.net/  groovy/grails/gradle/griffon/vert.x 21
  • 22.
    おすすめ書籍  “Gradle Effective Implementation Guide” Hubert Klein Ikkink (mrhaki)  http://mrhaki.blogspot.de/search/label/Gr adle%3AGoodness の人の本です 22
  • 23.
    Gradleに入門したい?  G*ワークショップZ 3/15はGradleハンズオン やります。ぜひご参加ください。  http://jggug.doorkeeper.jp/events/3007 23
  • 24.
    ありがとうございました http://nekofont.upat.jp/ 24