yukungのブログ

yukungの技術ブログ兼駄文置き場 

本が出るまで待てない!? Gradleハンズオン - G*ワークショップZ Oct 2014 に行ってきた #jggug

最近ずっと使ってます。Gradle。

今仕事でやってるプロジェクトも Gradle を使っているので、なんという俺得なタイミング、ということで行ってきました。

Gradle 本出版記念ということで、参加者だけのありがたい特典もありました。行ってよかったデス。

コンテンツ

  • @nobusue さんの Gradle イントロダクションと 2.0,2.1 の主な変更点
  • @literalice さんの Gradle プラグインハンズオン

LT

  • @kyon_mm さんの Gradle 2.2, 2.3 の変更点おさらい
  • @nobeans さんの OSS 開発の嗜み話
    • すいません、資料見つけられませんでした

以下、学び

plugins ブロックとプラグインポータル

  • Gradle2.1 で追加された
  • 3rd party のプラグインを使うときにより簡単になった
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath "com.bmuschko:gradle-tomcat-plugin:2.0"
    }
}
apply plugin: "com.bmuschko.tomcat"

〜2.0までこう書いていたのが、

plugins {
    id "com.bmuschko.tomcat" version "2.0"
}

これで良くなった。ただしプラグインポータルに登録されていることが前提。

インクリメンタルコンパイル

  • Gradle 2.1 で追加された
  • 変更のあった Java ソースのみ再コンパイルする
    • 2.0 までは、sourceSets に含まれる Java ソースに1つでも変更があれば全体を再コンパイルしていた
  • 効果
    • ビルド時間短縮
    • バイトコード処理や動的クラスリロードを行う場合の影響範囲の最小化
  • Ant の javac タスクではなく、Gradle 独自コンパイラに変更された
  • デフォルトでは無効となっている

有効にする場合は、

allprojects {
    tasks.withType(JavaCompile) {
        options.incremental = true
    }
}

と設定する。

Gradle プラグインの作成方法

Mavenプラグイン作るときと比べて、すごく簡単。

plugins {
    id "groovy"
    id "maven-publish"
}
dependencies {
    compile gradleApi() // Gradle の API にクラスパス通す
}
group = "com.example.hoge" // Maven リポジトリの名前空間
version = "0.1"
/*
 * 以下は maven-publish プラグインの設定
 * http://www.gradle.org/docs/current/userguide/publishing_maven.html
 */
publishing {
    publications {
        mavenJava(MavenPublication) {
            from components.java
        }
    }
}

この build.gradle が含まれているパスで publishToMavenLocal を叩くと ~/.m2/repository/ 以下に publish される。

import org.gradle.api.*
class HogePlugin implements Plugin<Project> {
    @Override
    void apply(Project project) {
        project.extensions.create("hoge", HogePluginExtension) // Project に対して extension を "hoge" という名前で設定
        println project.hoge.value // 設定した名前+プロパティ
    }
}
class HogePluginExtension { // 単なるPOJO(POGO)
    String value
}

利用側の build.gradle は、

hoge { // create 時に指定した名前
    value = "Hello hoge"
}

で利用する。

  • プラグインのテストは、org.gradle.testfixtures.ProjectBuilder を使って Project オブジェクトを作って、そのオブジェクトに対して操作することでテストできる。

Gradle2.2, 2.3 release notes

いいなーと思った変更点

  • Component Selection Rules
  • Declaring module replacements
  • Specify version control system for Intellij IDEA
  • support for renaming imported Ant targets
  • Sharing configuration files across builds

OSS 嗜み話

  • default task と gradle wrapper は設定しておこう
  • Java だけ入ってればとりあえずオッケーよ、の Gradle Wrapper はやっぱり強力だなぁと再認識
  • あと今度ドキュメント gaiden で書いてみよう

懇親会

  • @uehaj さんや @nobusue さんと話せて楽しかった

まとめ

こちらからは以上です。