Hi everyone,
I have a custom plugin (gradle-RC1) in which i have: MyPlugin.groovy MyPluginConvention.groovy MyPluginTask.groovy
in my gradle build i have convention block:
myConvention {
prop1 = "1"
prop2 = "2"
prop3 = "3"
}
But i also want to use external project properties (must have higher priority), for example gradle myTask -Pprop1=“100500” must override prop1
In MyPlugin i have next code:
void apply(Project project) {
MyPluginConvention convention = new MyPluginConvention()
project.convention.plugins.myConvention = convention
configureTask(project, convention)
}
void configureTask(Project project, MyPluginConvention convention) {
project.tasks.withType(MyPluginTask).whenTaskAdded { MyPluginTask task ->
task.conventionMapping.map('prop1')
{ resolveProperty(project, 'prop1', convention.prop1)
}
task.conventionMapping.map('prop2')
{ resolveProperty(project, 'prop2', convention.prop2)
}
task.conventionMapping.map('prop3')
{ resolveProperty(project, 'prop3', convention.prop3)
}
}
}
private def resolveProperty(Project project, String propertyName, def conventionProperty) {
return getProjectProperty(project, propertyName) ?: conventionProperty
}
private def getProjectProperty(Project project, String propertyName) {
return project.hasProperty(propertyName) ? project.property(propertyName) : null
}
And in MyPluginTask i use explicit getters to evaluate fields lazy. However, resolveProperty() method not works as expected, because when task gets properties the “project.property(‘prop1’)” method returns convention property - not the external project property.
How can i get the right behavior? Also “task.conventionMapping.map” is a little tricky for me. Where can i get some information about how it works, or could you suggest a better way of doing convention mapping?
Currently i’am using next workaround:
myConvention {
prop1 = loadProp1()
prop2 = "2"
prop3 = "3"
}
String loadProp1() {
return project.hasProperty('prop1') ? project.prop1 : "1"
}
Thanks.