Any way to configure Gradle to always trust outputs.upToDateWhen (overriding task history check)?


(Randall Minster) #1

Is there any way to override Gradle’s check for task history and always trust the result of ‘outputs.upToDateWhen’?

We have some tasks that execute some long-running database initialization scripts. These tasks have a simple query in the ‘outputs.upToDateWhen’ configuration. This works great to skip the tasks most of the time.

However, when developers first checkout the project from version control, the database init tasks always run on the first build because ‘No history is available for task’ even though the database is usually already initialized.


(Peter Niederwieser) #2

Do you have any inputs on that task?


(Randall Minster) #3

No, there are no inputs defined for that task.

Here’s an obviously contrived example. The ‘initDB’ task is always up to date. To simulate a checkout from version control, I delete the .gradle directory. The task runs unless there is task history present in the .gradle directory.

build.gradle:

task initDB() {
 outputs.upToDateWhen {true}
 doLast {
  println "Initializing database..."
  Thread.sleep(10000)
 }
}

Output when deleting .gradle directory and running:

> rmdir /s /q .gradle && gradle initDB --info
...
All projects evaluated.
Selected primary task 'initDB'
Tasks to be executed: [task ':initDB']
:initDB
Executing task ':initDB' due to:
No history is available for task ':initDB'.
Initializing database...

(Luke Daley) #4

You’d be better off using ‘onlyIf’ instead of up-to-date checking here.

http://gradle.org/docs/current/dsl/org.gradle.api.Task.html#org.gradle.api.Task:onlyIf(groovy.lang.Closure)


(Randall Minster) #5

Thanks. onlyIf works as I need. I can now see the difference between the ‘onlyIf’ and ‘outputs.upToDateWhen’ configurations.