Gradleのビルドフェーズとタスク定義「<<」の意味

はじめに

Gradleで実行時に指定してない無関係のタスクが勝手に動いてる。。
という状況に遭遇し、だいぶハマりました orz

その際の調査録です。同じようにハマった人の参考になれば幸いです。

先に簡単に結論

Gradleのビルドスクリプトを実行すると、内部的には以下の3フェーズが順に実行されます。

  1. 初期化フェーズ
  2. 設定フェーズ
  3. 実行フェーズ

そしてタスク定義では 「 << 」 の有無で処理されるフェーズに以下の差異があるため、

  • << 」 なし —> 設定フェーズで実行される
  • << 」 あり —> 実行フェーズで実行される

設定フェーズの段階で、タスクが動くと明示的に指定してないタスクも勝手に実行されてしまいます。

マニュアルの以下がこの辺の話ですが、だいぶ後半なので見落としてました。

 
以下で実際に単純なbuild.gradleを動かして試してみます。
 

何もタスクを定義しないbuild.gradle

まずはシンプルに何もタスクを定義していないビルドスクリプトを試してみます。

build.gradle は以下の通り、print文とメソッドfoo を定義しているだけです。

println "Hello"
def foo() {
    println "foo executed."
}

プロジェクトのディレクトリに移動し、helpコマンド実行してみます。(help以外のコマンドでも同様)

> cd <プロジェクトのディレクトリ>
> gradle help
Hello
:help
...
BUILD SUCCESSFUL

ここでのポイントは以下2点。普通のgroovyスクリプト動かしたときと同じような感じです。

  • 先頭のprintlnが実行され、”Hello”が出力されている
  • defで宣言したメソッドは実行されない

 

「<<」 なしでタスクを定義したbuild.gradle

build.gradle は以下の通り、print文と タスクfoo を 「<< 」なしで 定義しています。

println "Hello"
task foo {
    println "foo executed"
}

helpコマンド実行してみます。(help以外のコマンドでも同様)

> gradle help
Hello
foo executed
:help
...
BUILD SUCCESSFUL

ここでのポイントはhelpタスクを指定して実行したが

  • タスクfooが実行され、foo executedが出力されている

という点です。先ほどのdefキーワードで宣言したメソッドと扱いが異なりますね。設定フェーズでタスクfooが実行されています。

 

「<<」 ありでタスクを定義したbuild.gradle

build.gradle は以下の通り、print文と タスクfoo を 「<< 」ありで 定義しています。

println "Hello"
task foo <<{
    println "foo executed"
}

helpコマンド実行してみます。(help以外のコマンドでも同様)

> gradle help
Hello
:help
...
BUILD SUCCESSFUL

ここでのポイントはhelpタスクを指定して実行して、

  • タスクfooが実行されていない

という点です。設定フェーズでタスクfooが実行されていないためです。
では続いて、fooタスクを明示的に指定して実行してみます。

> gradle foo
Hello
:foo
foo executed

BUILD SUCCESSFUL

この場合は、実行フェーズでタスクfooが実行されているようです。

 

環境情報

以下の環境で試してみました。

  • Gradle 3.1
  • Groovy 2.4.7
  • JVM 1.8.0_92
  • Windows10

おそらくGradle1系2系でも同様な動作になると思います(未検証)

最後に

タスク定義時は「 << 」 の有無により、上記のような実行タイミングの差異があるので、注意してください。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA