将属性添加到JavaPlugin的SourceSets,Gradle

时间:2017-03-20 19:25:50

标签: gradle

我们正在尝试草拟自定义Gradle插件以使用我们的建模语言Umple。我们希望将它作为符合人体工程学的#34;尽可能允许在" sourceSet"中指定属性。水平。

例如,

sourceSets {
  main { 
    umple {
      foo = 'bar'
    }
  }
}

umple { // defaults
  foo = 'baz'
}

我们尝试在源集上添加扩展,并尝试按照Scala和Antlr插件的工作方式对方法进行建模。但是,我们无法弄清楚如何向sourceSet闭包应用程序添加额外的属性。任何帮助表示赞赏。

2 个答案:

答案 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插件为每个插件添加以下约定属性   在项目中设置的源。您可以在构建中使用这些属性   脚本,好像它们是源集对象的属性。