2017-01-06 90 views
1

我试图实现以下的DSL作为一个摇篮插件:摇篮和嵌套扩展

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始终。我现在可以将所有东西都声明为具有闭包的属性,但对于以前工作的东西来说,这是很多作品。我只想补充一个封闭的插件

回答

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) 
    } 

    ... 
} 

实现类似的功能

+0

其实我错了的东西见DefaultProject.copySpec(Closure):(!project.plugin = NULL) 如果总是真当我做project.extensions.create(“插件”,PluginExtension) 有没有什么办法来检查用户是否定义了build.gradle中的插件{}块? – NitroG42

+0

使用我的示例代码,你可以检查'if(plugin.pluginA == null)' –

+0

它完美的工作,谢谢! – NitroG42