2

2 つのソースの場所の構成を公開する必要がある小さな gradle プラグインを作成しています。私は現在、プロジェクト拡張機能を介してこれを行っており、コンシューマ gradle ファイルは次のような構文になります。

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

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

これに対する私の最初の試みは、次のように拡張クラスに 2 つのプロパティを設定することで達成されました。

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 を使用しますが、クリーンなコンシューマー構文を維持しますか?

前もって感謝します。

4

1 に答える 1

2

これと上記のピーターのコメントのおかげで(ピーターに二重に感謝することを意味します)、解決策を思いつきました。私の考えに 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"
        }
    }
于 2013-08-30T23:15:56.663 に答える