我正在尝试将以下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。我现在可以将所有内容声明为带闭包的属性,但这对于之前正在工作的东西来说有很多作用。我只想添加一个封闭的插件
答案 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)