目次
概要
- とあるタスクAとタスクBがあったとき、この二つのタスクの実行時の依存関係を定義したい時があります。
- 例えばJavaのビルドなどで、Jarを作る前にはコンパイルが終わっている前提であるとかです。
- そんな時、Gradleではdepends-onを使います。
depends-on
dependsOnとは
dependsOn
はタスクに定義するもので、このタスクは他のタスクが依存してますよ~というのを定義してあげるものです。- もうちょっと分かりやすく言うと、このタスクが実行される時、依存しているタスクが実行されている前提ですよ~、実行されてなきゃ困りますよ~という感じです。
taskA.dependsOn(taskB)
- こんな感じにすると、
taskA
の実行時はtaskB
がゼッタイ実行されているのです。
dependsOnに複数の依存タスクを指定すると…
-
dependsOn
では、複数のタスクを指定できます。 -
ただ、ここで注意しないといけないのは、複数指定したタスクたちの実行順序が定まらないということです。
taskA.dependsOn(taskB, taskC, taskD, ...)
-
taskA
の実行時はtaskB
とtaskC
とtaskD
が実行されているけど、taskB
とtaskC
とtaskD
の実行順は不定。 -
taskB
とtaskC
とtaskD
間でもdependsOn
でタスクの依存関係が指定されていればそれに従います。
must-run-after
mustRunAfterとは
- depends-onでッチガチにタスク間の依存関係を定義していけば実行順の制御はできるのですが
- 場合によっては常に実行して欲しいわけじゃないタスクとかもあったりますね。
- 例えばJavaのビルドなどで、ちょっとクラス名を変更したからコンパイルする前にクリーンしておいてから実行したいとかです。
- このケースを考えた場合、
taskCompile
にdependsOn
でtaskClean
を指定してしまうと、どんな時でもクリーンされてしまうようになってしまい、うまくいきません。 - そこで登場するのが
mustRunAfter
です。
mustRunAfterは、タスク間の実行順を強制する
- 例えば
taskB
は必ず、taskA
の後に実行して欲しいような場合、以下のようにします。taskB.mustRunAfter(taskA)
そして、以下のように実行するタスクを指定してGradleを起動することで、
taskA -> taskB
という実行順が保証されます。
$ gradle taskA taskB
似たようなのに shouldRunAfter というのもある
mustRunAfter
の方は厳密で、shouldRunAfter
の方はサイクル実行とか並列実行時は従わないことがあるよってことみたいです。- 込み入ったことをやらないのであれば、
mustRunAfter
で良いのではと思います。