Gradle タスク作成

Gradle はタスクを用意して実行することが基本である。タスクは Groovy で作成でき、このページでは基本的な作成方法を説明する。

タスク定義

Gradle はコマンドによってタスクを実行するプログラムである。 gradle compileJavagradle 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 タスクを実行したものです

doFirstdoLast

タスクは task{} に処理を書くだけでも作成できるが、通常はこの書き方はあまり使わない。 一般的なタスクでは doFirstdoLast を使う。

task taskName {
    doFirst {
        // 最初に実行する処理
    }

    doLast {
        // 最後に実行する処理
    }
}

doFirstdoLast はタスク内で使えるクロージャである。 それぞれ次の役割を持つ。

  • doFirst: 最初に実行するアクション。
  • doLast: 最後に実行するアクション。

タスクは用意されたアクションを順番に実行する。 アクションとは、実際に実行される処理の単位である。 doFirstdoLast は、そのアクション列の最初と最後に処理を追加する。 両方を必ず用意する必要はなく、どちらか一方だけでもよい。

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 の後に変数名を書き、= で値を指定する。 たとえば hoge123 を渡す場合は -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 オブジェクトにまとめられている。 たとえば abtasks.atasks.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 ***

この例では hellodoFirstaaa を呼び出し、doLastbbb を呼び出している。 出力の順序から呼び出し順を確認できる。

依存タスクを指定する

あるタスクを実行する前に別のタスクの実行が必須になる場合は、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 は実行されない。