Can gradle extensions handle lazy evaluation of a property?

The answer by Peter in my question here indicates that conventionMapping feature will definitely go away. It's best to avoid it.

Using afterEvaluate to solve the deferred configuration issue has made my code a lot cleaner than the conventionMapping approach.

class MyPlugin implements Plugin<Project> {
    void apply(Project project) {
        project.extensions.create('myPluginProps', MyPluginExtension)

        project.afterEvaluate {
            project.task(type: MyTask, 'thisTaskWorksIncorrectly') {
                input = project.myPluginProps.message
            }
        }
    }
}

EDIT

The below answer is now outdated. Since I provided it a better mechanism than convention mappings has been introduced for doing this called lazy properties.


The usual solution for this problem is to use convention mapping:

class MyPlugin implements Plugin<Project> {
    void apply(Project project) {
       project.extensions.create('myPluginProps', MyPluginExtension)

        project.task(type: MyTask, 'thisTaskWorksIncorrectly') {
            conventionMapping.input = { project.myPluginProps.message }
        }
    }
}

and then in the task:

class MyTask extends DefaultTask {
    def String input

    @TaskAction
    def action() {
        println "You gave me this: ${getInput()}"
    }

}

Please note that I explicitly used getter for input - the convention mapping won't kick in if you reference the field directly.

Tags:

Gradle