2013-08-29 53 views
2

我在写一个需要公开两个源位置配置的小gradle插件。我通过一个项目延长目前这样做的,消费者gradle这个文件将有如下语法:在自定义gradle插件中创建SourceSet样式语法

generator { 
    idl { 
     baseDir = "src" 
     include = "*.idl" 
     exclude = "**/.svn" 
    } 

    template { 
     baseDir = "src" 
     include = "*.template" 
     exclude = "**/.svn" 
    } 
} 

我在第一次尝试用具有在扩展类的两个属性,像这样完成的:

class GeneratorExtension { 
    public static final NAME = "generator" 

    private Project project 

    GeneratorExtension(Project project) { 
     this.project = project 
    } 

    @Input ConfigurableFileTree idl 
    @Input ConfigurableFileTree template 

    void idl(String dir, Closure closure) { 
     idl = project.fileTree(dir, closure) 
    } 

    void template(String dir, Closure closure) { 
     template = project.fileTree(dir, closure) 
    } 
} 

这改变了gradle这个文件语法:

generator { 
    idl (dir = "src") { 
     include = "*.idl" 
     exclude = "*" 
    } 

    template (dir = "src") { 
     include = "*.template" 
     exclude = "" 
    } 
} 

现在这个工作,但它并没有给我的干净的可用性我宁愿。我对gradle和groovy都很陌生,看起来我可能能够通过使用DefaultNamedDomainObjectSet完成我想要的功能,但是它引用了内部类,所以这就是我来这里的原因。

添加扩展程序的正确方法是什么使用FileTree,但保持干净的消费者语法?

在此先感谢。

+2

退房'project.container()',例如在[Gradle Build Language Reference]中(http://gradle.org/docs/current/dsl/index.html)。 –

+0

感谢您的提示!我现在以我想成为的方式运转起来! – Myles

回答

2

感谢this和Peter的评论(这意味着多谢Peter),我提出了一个解决方案。将NamedDomainObjectContainer引入到我的思维中,为消费者提供了更好的语法。

这里是我结束了:

generator { 
    idl { 
     dir = 'src' 
     include = "*.idl" 
     exclude = "*" 
    } 

    templates { 
     java { 
      dir = 'src' 
      include = '*.template' 
     } 

     javascript { 
      dir = 'src' 
      include = '*.template' 
     } 
    } 
} 

和插件代码:

class GeneratorPlugin implements Plugin<Project> { 
    private GeneratorExtension extension 
    void apply(Project project) { 
     def templates = project.container(FileTreeContainer) 
     extension = project.extensions.create(GeneratorExtension.NAME, GeneratorExtension, project, templates) 
     applyTasks(project) 
    } 

    void applyTasks(final Project project) { 
     project.task('generateJava', type: GenerateJavaTask, group: 'Preprocess', description: 'Generate Java files based on provided IDL files and templates') { } 
     project.task('generateJavascript', type: GenerateJavascriptTask, group: 'Preprocess', description: 'Generate Javascript files based on provided IDL files and templates') { } 
    } 
} 

class GeneratorExtension { 
    public static final NAME = "generator" 

    private Project project 
    @Input FileTreeContainer idl 
    @Input NamedDomainObjectContainer<FileTreeContainer> templates 

     GeneratorExtension(Project project, NamedDomainObjectContainer<FileTreeContainer> templates) { 
      this.project = project 
      idl = new FileTreeContainer("idl") 
      this.templates = templates 
     } 

     void idl(Closure closure) { 
      project.configure(idl, closure) 
      idl.fileTree = project.fileTree(idl.dir) { 
       include idl.include 
       exclude idl.exclude 
      } 
     } 

     void templates(Closure closure) { 
      templates.configure(closure) 
      String foo = "hello" 
     } 
    } 
相关问题