2013-08-29 2 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) 
    } 
} 
을 이 작동하지만, 나에게 내가 선호하는 깨끗한 가용성을 제공하지 않습니다 이제

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

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

:에 Gradle을 파일 구문을 변경

. 나는 모두 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" 
     } 
    } 
관련 문제