如何应用一个插件
应用二进制插件
什么是二进制插件
- 二进制插件就是实现了org.gradle.api.Plugin接口的插件,他们可以有plugin id
- 二进制插件一般都是被打包在一个jar里独立发布的,比如我们自定义的插件
实例
代码:
apply from:'version.gradle' task ex52PrintlnTask << { println "App版本是:${versionName},版本号是:${versionCode}" }
version.gradle
ext { versionName = '1.0.0' versionCode = 1 }
运行结果:
> Task :ex52PrintlnTask
App版本是:1.0.0,版本号是:1
- 分析:
- 其实这不算一个插件,它只是一个脚本;应用脚本插件,其实就是把这个脚本加载进来,和二进制插件不同的是它使用的是from关键字,后面紧跟是一个脚本文件,可以是本地的也可以是网络的,如果是网络的话要使用HTTPURL
- 虽然它不是一个真正的插件,但不能忽视它的作用,它是脚本文件模块化的基础,我们可以把庞大的脚本文件,进行分块、分段整理,拆分成一个共用、职责分明的文件
apply方法的其他用法
apply有三种使用方式
void apply(Map<String,?> options); void apply(Closure closure); void apply(Action<? super ObjectConfigurationAction> action);
闭包的方式如下:
apply { plugin 'java' }
Action的方式:
apply(new Action<ObjectConfigurationAction>(){ @override void execute(ObjectConfigurationAction objectConfigurationAction){ objectConfigurationAction.plugin('java) } })
应用第三方发布的插件
buildscript { repositories { jcenter() } dependencies { // gradle插件版本 classpath 'com.android.tools.build:gradle:3.0.0' } }
- 分析:
buildscript{}块是一个在构建项目之前,为项目进行前期准备和初始化相关配置依赖的地方,配置好所需的依赖,就可以应用插件了:
apply plugin:'com.android.application'
如果没有提前在buildscript里配置依赖的classpath,会提示找不到这个插件
- 分析:
使用plugins DSL应用插件
plugins DSL是一种新的插件应用方式,Gradle 2.1以上版本才可以使用。目前这个功能还在内测
plugins { id 'java' }
这样就应用了java插件,看着更简洁,符合DSL规范
如果该插件已经被托管在https://plugins.gradle.org/网站上,我们就不用再buildscript里配置classpath依赖了,直接使用plugins就可以应用插件:
plugins { id 'org.snoarqube' version '1.2' }
自定义插件
自定义插件必须要实现Plugin接口,这个接口只有一个apply方法,该方法在插件被应用的时候执行。所以我们可以实现这个方法,做我们想做的事情,比如这里创建一个名称为ex53CustomTask的任务给项目用
实例:
apply plugin:Ex53CustomPlugin class Ex53CustomPlugin implements Plugin<Project>{ void apply(Project project){ project.task('ex53CustomTask') << { println "这是一个通过自定义插件方式创建的任务" } } }
运行结果:
3$ gradle ex53 Starting a Gradle Daemon (subsequent builds will be faster) > Task :ex53CustomTask 这是一个通过自定义插件方式创建的任务
以上是我们定义的一个简单的插件,是定义在build.gradle脚本里,只能是自己的项目使用
创建一个Groovy工程,然后配置我们插件开发所需的依赖:
实例:
apply plugin:'Groovy' dependencies{ compile gradleApi() compile localGroovy() } //然后实现插件类 package com.github.rujews.plugins import org.gradle.api.Plugin import org.gradle.api.Project class Ex53CustomPlugin implements Plugin<Project>{ void apply(Project project){ project.task('ex53CustomTask') << { println "这是一个通过自定义插件方式创建的任务" } } }
每一个插件都有一个唯一的Plugin ID,以供使用者使用,现在我们定义这个plugin id。Gradle