在使用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"
}