Gradle plugin协同工作

作者: 大神带我来搬砖 | 来源:发表于2018-11-05 18:31 被阅读144次

    在使用Gradle的过程中发现,Gradle的plugin比maven中的plugin更加灵活的一点在于可以相互影响。
    例如假设一开始在build.gradle中设置了Bar这个插件,它有name和label两个属性,并添加了一个叫hello的task,设置完name和label之后,执行hello task将输出name和label。

    class BarPluginExtension {
        String name
        String label
    }
    
    class BarPlugin implements Plugin<Project> {
    
        void apply(Project project) {
            def extension = project.extensions.create('bar', BarPluginExtension)
            project.task('hello') {
                doLast {
                    println("name is ${extension.name}, label is ${extension.label}")
                }
            }
        }
    }
    
    apply plugin: BarPlugin
    
    bar {
        name = "name"
        label = "label"
    }
    
    

    执行hello这个task后输出如下

    > Task :hello
    name is name, label is label
    

    这时我们在build.gradle文件中添加一个Foo插件,希望添加了这个插件后,hello输出的name和label变成大写。
    Foo插件代码如下

    class FooPlugin implements Plugin<Project> {
    
        void apply(Project project) {
            project.plugins.withType(BarPlugin.class, {
                project.afterEvaluate {
                    def extension = project.extensions.findByType(BarPluginExtension.class)
                    extension.name = extension.name.toUpperCase()
                    extension.label = extension.label.toUpperCase()
                }
            })
        }
    }
    

    其中

    project.plugins.withType(BarPlugin.class,......)
    

    表示Foo plugin只有在Bar plugin存在的时候才起作用。

    使用

     project.afterEvaluate
    

    的目的是为了在build.gradle中将Foo plugin的apply和Foo的写在一起。

    apply plugin: BarPlugin
    apply plugin: FooPlugin
    
    bar {
        name = "name"
        label = "label"
    }
    

    否则必须写为

    apply plugin: BarPlugin
    
    bar {
        name = "name"
        label = "label"
    }
    
    apply plugin: FooPlugin
    

    完整代码如下

    class BarPluginExtension {
        String name
        String label
    }
    
    class BarPlugin implements Plugin<Project> {
    
        void apply(Project project) {
            def extension = project.extensions.create('bar', BarPluginExtension)
            project.task('hello') {
                doLast {
                    println("name is ${extension.name}, label is ${extension.label}")
                }
            }
        }
    }
    
    class FooPlugin implements Plugin<Project> {
    
        void apply(Project project) {
            project.plugins.withType(BarPlugin.class, {
                project.afterEvaluate {
                    def extension = project.extensions.findByType(BarPluginExtension.class)
                    extension.name = extension.name.toUpperCase()
                    extension.label = extension.label.toUpperCase()
                }
            })
        }
    }
    
    apply plugin: BarPlugin
    apply plugin: FooPlugin
    
    bar {
        name = "name"
        label = "label"
    }
    
    
    

    相关文章

      网友评论

      本文标题:Gradle plugin协同工作

      本文链接:https://www.haomeiwen.com/subject/shxexqtx.html