しおしお

IntelliJのあれやこれや

Gradleで変更がない場合にタスク実行をスキップする方法

Gradleでカスタムタクでインプットファイル等に変更がない場合、タスクの実行をスキップ(UP-TO-DATEって出力されるやつ)する方法。

入力情報が存在しない場合に、タスクをスキップさせるには、Taskのinputsとoutputsプロパティに入出力情報を指定してあげる。

inputsには、ファイルはディレクトリ、プロパティが指定できる。
outputsには、ディレクトリや1つ以上のファイルが指定できる。

この例だと、input.txtが入力情報と定義されているので、input.txtに変更がない場合はタスクの実行がスキップされる。
出力定義には、outputディレクトリを指定しているので、このディレクトリがない場合は入力情報が変更されていなくてもタスクは実行される。

task hoge {
  inputs.file file('input.txt')
  outputs.dir file('./output')
  doLast {
    new File('./output').mkdir()
    println('make output dir.')
  }
}

実行例

初回実行

最初の実行なのでタスクは実行される。

$ gradle --daemon hoge
:hoge
make output dir.

BUILD SUCCESSFUL
2回目の実行

ファイルに変更がないので、UP-TO-DATEと出力されてタスクの実行はスキップされる。

$ gradle --daemon hoge
:hoge UP-TO-DATE

BUILD SUCCESSFUL

アウトプットがない場合

タスク内でファイルやディレクトリを作る場合には、outputsプロパティの定義ができるけど、アウトプットがデータベースの場合などoutputsが定義できない場合がある。

このような場合は、outputsプロパティのupToDateWhenメソッドを使って常にtrue(出力は最新状態)と返してあげれば良い。
upToDateWhenは、出力が最新かどうかを自由に定義できるメソッド

task hoge {
  inputs.file file('input.txt')
  outputs.upToDateWhen {true}
  doLast {
    println('hoge')
  }
}

おわり。