我们正在尝试草拟自定义Gradle插件以使用我们的建模语言Umple。我们希望将它作为符合人体工程学的#34;尽可能允许在" sourceSet"中指定属性。水平。
例如,
sourceSets {
main {
umple {
foo = 'bar'
}
}
}
umple { // defaults
foo = 'baz'
}
我们尝试在源集上添加扩展,并尝试按照Scala和Antlr插件的工作方式对方法进行建模。但是,我们无法弄清楚如何向sourceSet闭包应用程序添加额外的属性。任何帮助表示赞赏。
答案 0 :(得分:3)
// TODO: take inspiration from https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/java/org/gradle/api/tasks/GroovySourceSet.java
public interface UmpleSourceSet {
SourceDirectorySet getUmple();
UmpleSourceSet umple(Closure configureClosure);
UmpleSourceSet umple(Action<? super SourceDirectorySet> configureAction);
SourceDirectorySet getAllUmple();
}
// TODO: take inspiration from https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/java/org/gradle/api/internal/tasks/DefaultGroovySourceSet.java
public class DefaultUmpleSourceSet implements UmpleSourceSet { ... }
// TODO: take inspiration from https://github.com/gradle/gradle/blob/89b1c11a160c5f597c6c1ca50f01cf57e43c8356/subprojects/plugins/src/main/java/org/gradle/api/plugins/GroovyBasePlugin.java#L88
public class UmplePlugin implements Plugin<Project> {
private final SourceDirectorySetFactory sourceDirectorySetFactory;
@Inject
public UmplePlugin(SourceDirectorySetFactory sourceDirectorySetFactory) {
this.sourceDirectorySetFactory = sourceDirectorySetFactory;
}
public void apply(Project project) {
project.getConvention().getPlugin(JavaPluginConvention.class).getSourceSets().all(new Action<SourceSet>() {
public void execute(SourceSet sourceSet) {
DefaultUmpleSourceSet umpleSourceSet = new DefaultUmpleSourceSet(((DefaultSourceSet) sourceSet).getDisplayName(), sourceDirectorySetFactory);
new DslObject(sourceSet).getConvention().getPlugins().put("umple", umpleSourceSet);
umpleSourceSet.getUmple().srcDir("src/" + sourceSet.getName() + "/umple");
}
}
}
}
答案 1 :(得分:1)
这听起来与GroovySourceSet
类似。有关gradle来源中的GroovySourceSet
引用,请参阅here。
这看起来像GroovyBasePlugin.java中的有趣位:
private void configureSourceSetDefaults(final JavaBasePlugin javaBasePlugin) {
project.getConvention().getPlugin(JavaPluginConvention.class).getSourceSets().all(new Action<SourceSet>() {
public void execute(SourceSet sourceSet) {
final DefaultGroovySourceSet groovySourceSet = new DefaultGroovySourceSet(((DefaultSourceSet) sourceSet).getDisplayName(), sourceDirectorySetFactory);
new DslObject(sourceSet).getConvention().getPlugins().put("groovy", groovySourceSet);
groovySourceSet.getGroovy().srcDir("src/" + sourceSet.getName() + "/groovy");
*编辑*
我认为魔法存在于DSLObject(例如:new DslObject(sourceSet).getConvention().getPlugins().put(...)
)
为增强型DSL对象提供统一的类型化接口。这个 旨在用于由装饰的对象 类生成器。
请参阅文档here
Groovy插件为每个插件添加以下约定属性 在项目中设置的源。您可以在构建中使用这些属性 脚本,好像它们是源集对象的属性。