Gradle和嵌套扩展

时间:2017-01-06 10:38:42

标签: gradle gradle-plugin

我正在尝试将以下dsl作为Gradle插件实现:

plugin {
   pluginA {
      property1 ""
      property2 ""
   }
   pluginB {
      property3 ""
   }
}

pluginA和pluginB没什么相似之处,我不想使用NamedDomainObjectContainer。 使用之前的dsl,一切都还可以:

pluginA {
   property1 ""
   property2 ""
}
pluginB {
   property3 ""
}

project.pluginA.extensions.create('pluginA', PluginAExtension)
project.pluginB.extensions.create('pluginB', PluginBExtension)

我可以检查用户是否定义了这些扩展名:

if(project.pluginA != null) {
    //Configure task
}

但是由于使用了我的主插件,如果我声明这样的子扩展:

project.extensions.create("plugin", PluginExtension)
project.plugin.extensions.create('pluginA', PluginAExtension)
project.plugin.extensions.create('pluginB', PluginBExtension)

如果用户这样做:

project {

}

if(project.plugin.pluginA != null)返回true

我试过没有plugin.extensions.create(),并直接在扩展类中使用:

class PluginExtension {
    PluginAExtension pluginA
    PluginBExtension pluginB
}

但现在我总是得到pluginA()== null。我现在可以将所有内容声明为带闭包的属性,但这对于之前正在工作的东西来说有很多作用。我只想添加一个封闭的插件

1 个答案:

答案 0 :(得分:2)

我想你想要

import org.gradle.util.ConfigureUtil;

class PluginExtension {
    PluginAExtension pluginA
    ...

    PluginAExtension pluginA(Closure closure) {
        return pluginA(ConfigureUtil.configureUsing(closure))
    }

    void pluginA(Action<? super PluginAExtension> action) {
        if (pluginA == null) pluginA = new PluginAExtension()
        action.execute(pluginA)
    }

    ...
}

有关类似功能,请参阅DefaultProject.copySpec(Closure)