2017-01-06 92 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