Gradleでのビルドは、初期化、設定、実行の3つのフェーズに分けられ、その順にビルドが行われる。
※詳細はドキュメントを参照してほしい。
http://gradle.monochromeroad.com/docs/userguide/build_lifecycle.html
特に設定フェーズと実行フェーズは混同しやすいが、
その区別を意識しないと、自分で書いたbuild.gradleの設定が意図したとおりに動かなかったりする。
例
build.gradleに下記ののように記述し、gradle myTask
を実行したら、どのように出力されるだろうか。
println name + ": " + "FIRST"
task myTask {
println name + ": " + "First"
doFirst {
println name + ": " + "doFirst block"
}
doLast {
println name + ": " + "doLast block"
}
println name + ": " + "Last"
}
println name + ": " + "LAST"
結果は以下の通り。
gradle-test2: FIRST
myTask: First
myTask: Last
gradle-test2: LAST
:myTask
myTask: doFirst block
myTask: doLast block
BUILD SUCCESSFUL
なぜか
上記の例では、doFirst、doLastは実行フェーズで評価され、それ以外は設定フェーズで評価されたため。
別のTaskの記述方法であるmyTask << {}
はdoLastと同等だが、gradle3.3の環境では将来的に廃止予定という警告がでる。