在使用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í)我們在build.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"
}