Gradle plugin協(xié)同工作

在使用Gradle的過程中發(fā)現(xiàn),Gradle的plugin比maven中的plugin更加靈活的一點(diǎn)在于可以相互影響。
例如假設(shè)一開始在build.gradle中設(shè)置了Bar這個(gè)插件,它有name和label兩個(gè)屬性,并添加了一個(gè)叫hello的task,設(shè)置完name和label之后,執(zhí)行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"
}

執(zhí)行hello這個(gè)task后輸出如下

> Task :hello
name is name, label is label

這時(shí)我們?cè)赽uild.gradle文件中添加一個(gè)Foo插件,希望添加了這個(gè)插件后,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存在的時(shí)候才起作用。

使用

 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"
}


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容