Gradle初心者のつまずきポイント

今回初めてGradleを触ったのだが、gradle.buildの仕様にいろいろ困らされたので、以下にメモ書きとして記載する。

初めてgradleを触った人なら、誰でも一度は詰まったであろうポイントを3つ紹介する。

変数の定義

変数の定義はdefでできる。

def a = 1
println a

defを書かない場合、ビルドエラー。

gradleとgradlewの違い

gradleでプロジェクトを生成すると、gradlewが生成されるがこちらは何者なのか。 プロジェクトの実行はgradleコマンドでできるため、不必要なのではないか。

以下のページに答えがあった。

gradleとgradlewの違い - Qiita

要するにgradleのプロジェクトを生成するとき以外は、gradlewを使えばいいという話。 gradlewはgradleがローカルにインストールされていない場合でも実行できる。 またPCの環境に関係なく、gradlew内で指定されたバージョンのgradleをベースにプロジェクトが実行される。

設定フェーズの存在

以下のようなbuild.gradleを作成する。

println("最初")

task foo {
    println("タスク: foo")
}

task bar {
    println("タスク: bar")
}

println("最後")

シェルでのgradle fooの実行結果は次のようになる。

gradle foo

//最初
//タスク: foo
//タスク: bar
//最後

通常のプログラミング言語を書く感覚では「タスク bar」は表示されないが、gradleの場合は表示されてしまう。

Gradle のタスク定義のあれこれ - Qiita

設定フェーズで実行される部分は、指定しているタスクにかかわらず常に実行される。 したがって、設定フェーズで実行される部分に間違ってタスクの処理を書いてしまうと、タスクを指定していないのに処理が実行されるという状態になってしまうので注意しなければならない。

とのことで、気をつけなければならない。

対処法として、doFirst, doLastのブロック内に書くと良い。

println("最初")

task foo {
    println("タスク: foo")
}

task bar {
    doFirst {
         println("タスク: bar1")
    }
    doLast {
        println("タスク: bar2")
    }
}

println("最後")

このような書き方をすると、println("タスク: bar1"), println("タスク: bar2")はfooタスクの実行時には表示されない。