Gradle タスク作成
タスク定義
Gradle はコマンドによってタスクを実行するプログラムである。
gradle compileJava や gradle run といったコマンドは、それぞれ compileJava タスク、run タスクを実行しているという意味である。
タスク定義の基本
タスクはユーザーが定義できる。
ビルドファイルである build.gradle にタスクの処理を書いておくと、gradle コマンドから呼び出して実行できる。
タスクは次の形式で定義する。
task taskName {
// 実行する処理
}
task キーワードを使ってタスクを定義する。
その後にタスク名を書き、{} の中にタスクの内容を書く。
次のような書き方もできる。
task (taskName) {...}
task ('taskName') {...}
例として、build.gradle の末尾に次のコードを追加する。
task hello {
println('これは hello タスクを実行したものです')
}
保存して、ターミナルで次のように実行する。
$ gradle hello
hello タスクが実行され、println の出力以外にも Gradle のメッセージが表示される。
Starting a Gradle Daemon (subsequent builds will be faster)
> Configure project :
これは hello タスクを実行したものです
BUILD SUCCESSFUL in 16s
-q オプションを付けて quiet モードで実行すると、多くの出力が省略される。
$ gradle -q hello
出力はかなりシンプルになる。
これは hello タスクを実行したものです
doFirst と doLast
タスクは task の {} に処理を書くだけでも作成できるが、通常はこの書き方はあまり使わない。
一般的なタスクでは doFirst と doLast を使う。
task taskName {
doFirst {
// 最初に実行する処理
}
doLast {
// 最後に実行する処理
}
}
doFirst と doLast はタスク内で使えるクロージャである。
それぞれ次の役割を持つ。
doFirst: 最初に実行するアクション。doLast: 最後に実行するアクション。
タスクは用意されたアクションを順番に実行する。
アクションとは、実際に実行される処理の単位である。
doFirst と doLast は、そのアクション列の最初と最後に処理を追加する。
両方を必ず用意する必要はなく、どちらか一方だけでもよい。
task hello {
doLast {
println('これは hello タスクの doLast です。')
}
doFirst {
println('これは hello タスクの doFirst です。')
}
}
gradle hello を実行する。
> Task :hello
これは hello タスクの doFirst です。
これは hello タスクの doLast です。
BUILD SUCCESSFUL in 0s
1 actionable task: 1 executed
コード上では doLast が先に書かれていても、実行時には doFirst が先に実行される。
パラメータの受け渡し
タスクには実行時に必要な値をパラメータとして渡せる。 タスク処理内では変数として利用する。
task msg {
println("you typed: " + x)
}
変数 x に値を設定するには、Gradle コマンド実行時に次のように指定する。
$ gradle msg -Px=value
-P の後に変数名を書き、= で値を指定する。
たとえば hoge に 123 を渡す場合は -Phoge=123 と書く。
次の例は数値を受け取り、その数値までカウントを表示する。
task hello {
doLast {
def n = max.toInteger()
for(def i in 1..n){
println("No," + i + " count.")
}
println("--end.")
}
}
次のように実行する。
$ gradle hello -Pmax=5
出力は次のようになる。
> Task :hello
No,1 count.
No,2 count.
No,3 count.
No,4 count.
No,5 count.
--end.
def n = max.toInteger() で変数 max を整数に変換し、n に代入している。
その値を使って for で繰り返し処理を行う。
他のタスクの呼び出しと依存
他のタスクを呼び出す
タスクから別のタスクを呼び出したい場合がある。 次のようなタスクがあるとする。
task a {...}
task b {...}
Java のメソッドのように b() と呼び出しても動作しない。
すべてのタスクは tasks オブジェクトにまとめられている。
たとえば a と b は tasks.a、tasks.b として指定できる。
そのタスクオブジェクトの execute メソッドを呼び出す。
tasks.a.execute()
tasks.b.execute()
簡単な例は次のとおりである。
task hello {
doFirst {
println("*** start:hello task ***")
tasks.aaa.execute()
}
doLast {
tasks.bbb.execute()
println("*** end:hello task ***")
}
}
task aaa {
doLast {
println("<< This is A task! >>")
}
}
task bbb {
doLast {
println("<< I'm task B!! >>")
}
}
gradle hello を実行すると次のように表示される。
> Task :hello
*** start:hello task ***
<< This is A task! >>
<< I'm task B!! >>
*** end:hello task ***
この例では hello の doFirst で aaa を呼び出し、doLast で bbb を呼び出している。
出力の順序から呼び出し順を確認できる。
依存タスクを指定する
あるタスクを実行する前に別のタスクの実行が必須になる場合は、dependsOn を使う。
task taskName (dependsOn : 'task') {
// omitted
}
次の書き方もできる。
task taskName {
dependsOn : 'task'
// omitted
}
このように記述しておくと、タスクが呼び出されたときに dependsOn で指定したタスクが先に実行され、その後で本体の処理が実行される。
複数のタスクを指定する場合は ['a', 'b', 'c'] のように配列で指定する。
この場合、書いた順に実行される。
task hello(dependsOn:['aaa', 'bbb']) {
doFirst {
println("*** start:hello task ***")
}
doLast {
println("*** end:hello task ***")
}
}
task aaa {
doLast {
println("<< This is A task! >>")
}
}
task bbb {
doLast {
println("<< I'm task B!! >>")
}
}
gradle hello で実行する。
> Task :aaa
<< This is A task! >>
> Task :bbb
<< I'm task B!! >>
> Task :hello
*** start:hello task ***
*** end:hello task ***
最初に aaa、次に bbb が実行され、その後で hello が呼び出される。
dependsOn によって、依存タスクが完了するまで hello は実行されない。