tags:

views:

38

answers:

1

A)
task build << {
description = "Build task."
ant.echo('build')
}

B)
task build {
description = "Build task."
ant.echo('build')
}

I notice that with type B, the code within the task seems to be executed when typing gradle -t - ant echoes out 'build' even when just listing all the various available tasks. The description is also actually displayed with type B. However, with type A no code is executed when listing out the available tasks, and the description is not displayed when executing gradle -t. The docs don't seem to go into the difference between these two syntaxes (that I've found), only that you can define a task either way.

+2  A: 

The first syntax defines a task, and provides some code to be executed when the task executes. The second syntax defines a task, and provides some code to be executed straight away to configure the task. For example:

task build << { println 'this executes when build task is executed' }
task build { println 'this executes when the build script is executed' }

In fact, the first syntax is equivalent to:

task build { doLast { println 'this executes when build task is executed' } }

So, in your example above, for syntax A the description does not show up in gradle -t because the code which sets the description is not executed until the task executed, which does not happen when you run gradle -t.

For syntax B the code that does the ant.echo() is run for every invocation of gradle, including gradle -t

To provide both an action to execute and a description for the task you can do either of:

task build(description: 'some description') << { some code }
task build { description = 'some description'; doLast { some code } }
Adam Murdoch
Awesome. Thanks.
bergyman
So if you've got both code that needs to be executed to configure the task as well as code to be executed when the task is called, syntax B with a doLast closure is the way to go.
bergyman