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