2017年4月22日土曜日

Gradle 入門

概要

Gradle はビルドツールの一つで主に Java で使用されるビルドツールです
いろいろな API が提供されており、ant や maven より強力な機能を提供してます
また、groovy という言語が使えるのでビルド定義をプログラマブルに記載することができます

環境

  • Ubuntu 16.04
  • gradle 3.5

gradle のインストール

  • curl -s “https://get.sdkman.io” | bash
  • source “/root/.sdkman/bin/sdkman-init.sh”
  • sdk help
  • sdk install gradle

学習

いろいろなタスクを定義して実行しながら学習していきます

  • vim gradle.build

タスク作成

task hello {
    doLast {
        println 'hello'
    }
}
  • gradle -q hello

-q は quiet で出力省略

別タスク作成

task hello2 << {
  println 'hello2'
}
  • gradle -q hello2

groovy 関数を使う

task upper << {
  String s = 'hoge'
  println "Original: " + s
  println "Upper: " + s.toUpperCase()
}
  • gradle upper

times でループさせる

task c << {
  int sum = 0
  4.times {
    sum += it
    println sum
  }
}
  • gradle c

タスクに依存関係を持たせる

task world(dependsOn: hello) << {
  println 'world'
}
  • gradle world

先に (ファイルの先頭に) hello タスクを定義しておかないとエラーとなる

動的タスクを作成する

4.times { count ->
  task "task$count" << {
    println count
  }
}
  • gradle task1 task2 task3 task4

タスク API を使って依存関係を持たせる

4.times { count ->
  task "task$count" << {
    println count
  }
}
task0.dependsOn task1 task2

宣言したタスクには gradle が準備する API がいくつか準備されている
その中の dependsOn という API を使えば依存関係を持たせることができる

  • gradle task0

タスクに前後の処理を追加する

hello2.doFirst {
  println 'doFirst'
}

hello2.doLast {
  println 'doLast'
}

今まででてきた << は doLast のエイリアスになっている

  • gradle hello2

空のタスクを定義して API で処理を記載する

task hello3
hello3 << {
  println 'hello3'
}
hello3 {
  println 'hello3.1'
}

最後のようにタスクを定義したあとで処理を記載することができます
この場合は「hello3.1」->「hello3」と表示されます
(<< が doLast のエイリアスのため)

  • gradle hello3

タスクにプロパティを持たせる

task extv {
  ext.p = 'value1'
}
task m << {
  println extv.p
}

extv タスクに p プロパティを定義して値を持たせています
タスク内のプロパティにアクセスするには「タスク名.プロパティ名」でアクセスすることができます
task の後に doFirst も doLast も設定していない場合は何かタスク実行を実行した時に必ず実行されるタスクになります

  • gradle m

ant タスクを利用する

task tant << {
  ant.echo("tant")
}

ant.echo を使う場合 -q を付与すると出力されないので注意してください
他にもいろいろな ant API があるので詳しくはこちらを参照してください

  • gradle tant

関数を定義する

int sum(int a, int b) {
  a + b
}
task m1 << {
  println sum(1, 2)
}
  • gradle m1

デフォルトタスク

defaultTasks 'pre1', 'pre2'

task pre1 << {
  println 'pre1'
}
task pre2 << {
  println 'pre2'
}

こうすることで gradle だけでタスクを実行することができます
gradle pre1 pre2 を実行するのと同義になります

  • gradle

有効非巡回グラフ (DAG) の利用

task deploy << {
  println "deployed version: $version"
}

task pdeploy(dependsOn: deploy) << {
  println 'production deploy'
}

gradle.taskGraph.whenReady {taskGraph ->
  if (taskGraph.hasTask(pdeploy)) {
    version = "production"
  } else {
    version = "develop"
  }
}

gradle.taskGraph.whenReady を利用することであるタスクによって条件分岐することができます
version は gradle でデフォルトで使える変数です (デフォルトは unspecified が入っている)

  • gradle deploy
  • gradle pdeploy

例えば version を使わず独自の変数を使う場合は以下のようにも書けます
(ちょっと前にやった ext の拡張タスクプロパティを使います)

task deploy << {
  println "deployed version: $version"
}

task pdeploy(dependsOn: deploy) << {
  println 'production deploy'
}

gradle.taskGraph.whenReady {taskGraph ->
  if (taskGraph.hasTask(pdeploy)) {
    version = "production"
  } else {
    version = "develop"
  }
}

変数を使う

def a = 'hoge'

task at << {
  print a
}
  • gradle at

クラスを定義して使う

class Letter {
  def msg = 'default'

  def send() {
    println msg
  }
}

ext.letter = new Letter()
ext.letter.setMsg('hello')
ext.letter.send()
ext.letter.msg = 'HELLO'
ext.letter.send()
ext {
  letter.msg = 'hello'
  letter.send()
}

クラス Letter を定義しオブジェクトを ext.letter として保存します
クラスで定義したメソッドおよびプロパティにアクセスすることができます
プロパティへのアクセスはドット区切りの他、スクリプトブロックでもプロパティにアクセスできます
スクリプトブロックは所謂クロージャで処理を記述することができるので、関数へのアクセス、呼び出しも可能です
なお、スクリプトブロックでオブジェクトへの参照はできないので注意してください

  • gradle

作成した task も含めて存在する全タスクを確認する方法

  • gradle tasks --all

--all があることで自分で作成したタスクも確認することができる

プロジェクト内で使用できるデフォルトプロパティの一覧を表示する

  • gradle -q properties

ずらっと設定、使用可能なプロパティの一覧が表示されます

最後に

基本的なタスクの学習は以上です
実際に簡単なタスクでも実際に書いて手で動かすことで得られる知見も多くなると思います
gradle は Java でよく使われるイメージがありますが元は依存性を解決するビルドツールです
なので、Java だけではなくシェルスクリプトや別の言語などでも使うことができます

デフォルトで Java で使えるプラグインやタスクが多く提供されているので Java で使われる機会が多いんだと思います

gradle 自体にはまだまだ様々な使い方があるので興味があれば学習してみるといいと思います
自分も何か他にトピックがあれば紹介していきたいと思います

参考サイト

0 件のコメント:

コメントを投稿