概要
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 件のコメント:
コメントを投稿