Gradle 和嵌套扩展

Gradle and nested extensions

我正在尝试将以下 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) returns 真

我尝试不使用 plugin.extensions.create(),直接在扩展中使用 class :

class PluginExtension {
    PluginAExtension pluginA
    PluginBExtension pluginB
}

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

我想你想要

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)