内容简介:gradle 插件开发
在使用Android Studio进行开发的时候,我们创建一个Android工程,会默认生成一个build.gradle脚本,打开脚本你会看到以下代码:
apply plugin: 'com.android.application'
如果我们创建一个Library的话,就会变成:
apply plugin: 'com.android.library'
其实这就是在gradle脚本引用android为我们提供的插件,plugin表示插件,’com.android.application’表示我们引用的插件名,通常是以包名来命名。
这个插件是怎么被引用进来的?我们可以在根目录找到另外一个build.gradle文件,打开可以看到以下代码:
buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.0.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { jcenter() } }
- buildscript方法是定义了全局的相关属性
- repositories定义了jcenter作为仓库。一个仓库代表着你的依赖包的来源,例如maven仓库。
- dependencies用来定义构建过程。
- classpath ‘com.android.tools.build:gradle:2.0.0’,就是将远程的插件下载到本地并将其构建到我们工程当中。
Gradle 插件开发
apply plugin: 'com.android.library' apply plugin: 'com.android.application'
这些都是插件 ,我们可以自己定义一些插件方便构建项目
官网介绍插件打包方式
Gradle 的插件有三种打包方式,主要是按照复杂程度和可见性来划分:
Build script
把插件写在 build.gradle 文件中,一般用于简单的逻辑,只在该 build.gradle 文件中可见
buildSrc 项目
将插件源代码放在 rootProjectDir/buildSrc/src/main/groovy 中,只对该项目中可见,适用于逻辑较为复杂,但又不需要外部可见的插件
独立项目
一个独立的 Groovy 和 Java 项目,可以把这个项目打包成 Jar 文件包,一个 Jar 文件包还可以包含多个插件入口,将文件包发布到托管平台上,供其他人使用。本文将着重介绍此类。
Build script 插件
在 build.gradle 直接加入
class ApkDistPlugin implements Plugin<Project> { //创建一个Plugin就需要实现Plugin接口,并且重写它的apply方法,这个类当中就是用来实现插件的逻辑的,比如创建task,获取外部的参数都需要在这里面完成。 @Override void apply(Project project) { project.task('apkdist') << { println 'hello, world!' } } } apply plugin: ApkDistPlugin
命令行运行
$ ./gradlew -p app/ apkdist :app:apkdist hello, world!
插件是一个类,继承自 org.gradle.api.Plugin 接口,重写 void apply(Project project) 方法,这个方法将会传入使用这个插件的 project 的实例,这是一个重要的 context
接受外部参数
这个参数的结构 收到 ApkDistExtension的约束
apkdistconf { nameMap { name -> println 'hello,' + name return name } destDir 'your-distribution-dir' }
接受一个插件 name ,和目标路径
参数的内容后面继续完善。那这两个参数怎么传到插件内呢?
org.gradle.api.Project 有一个 ExtensionContainer getExtensions() 方法,可以用来实现这个传递。
声明参数类
声明一个 Groovy 类,有两个默认值为 null 的成员变量:
class ApkDistExtension { Closure nameMap = null; String destDir = null; }
接受参数
project.extensions.create('apkdistconf', ApkDistExtension); ``` 要注意,create 方法的第一个参数就是你在 build.gradle 文件中的进行**参数配置的 dsl 的名字**,必须一致;第二个参数,就是参数类的名字。 ### 获取和使用参数 在 create 了 extension 之后,如果传入了参数,则会携带在 project 实例中, ```java def closure = project['apkdistconf'].nameMap; closure('wow!'); println project['apkdistconf'].destDir
独立项目插件
创建项目
在 Android Studio 中新建 Java Library module “plugin”。
修改 build.gradle 文件
添加 Groovy 插件和对应的两个依赖。
//removed java plugin apply plugin: 'groovy' dependencies { compile gradleApi()//gradle sdk compile localGroovy()//groovy sdk compile fileTree(dir: 'libs', include: ['*.jar']) }
修改项目文件夹
src/main 项目文件下:
- 移除 java 文件夹,因为在这个项目中用不到 java 代码
- 添加 groovy 文件夹,主要的代码文件放在这里
- 添加 resources 文件夹,存放用于标识 gradle 插件的 meta-data
建立对应文件
注意:
groovy 文件夹中的类,一定要修改成 .groovy 后缀,IDE 才会正常识别。
resources/META-INF/gradle-plugins 这个文件夹结构是强制要求的,否则不能识别成插件。
io.github.xuyushi.properties 文件
如果写过 Java 的同学会知道,这是一个 Java 的 properties 文件,是 key=value 的格式。这个文件内容如下:
implementation-class=io.github.xuyushi.ApkDistPlugin
按其语义推断,是指定这个插件的入口类。
- 英文敏感的同学可能会问了,为什么这个文件的承载文件夹是叫做 gradle-plugins,使用复数?没错,这里可以指定多个 properties 文件,定义多个插件,扩展性一流,可以参考 linkedin 的插件的组织方式。
- 使用这个插件的时候,将会是这样:
apply plugin:'io.github.xuyushi.apkdist'
因此, com.asgradle.apkdist
这个字符串在这里,又称为这个插件的 id,不允许跟别的插件重复,取你拥有的域名的反向就不会错。
id 为properties 的名称
现在项目结构为
├── build.gradle ├── libs ├── plugin.iml └── src └── main ├── groovy │ └── io │ └── github │ └── xuyushi │ ├── ApkDistExtension.groovy │ └── ApkDistPlugin.groovy └── resources └── META-INF └── gradle-plugins └── io.github.xuyushi.properties
将 plugin module 传到本地 maven 仓库
添加 gradle.properties
PROJ_NAME=gradleplugin PROJ_ARTIFACTID=gradleplugin PROJ_POM_NAME=Local Repository LOCAL_REPO_URL=file:///Users/xuyushi/Documents/Android/repo/ PROJ_GROUP=io.github.xuyushi.gradleplugin_test PROJ_VERSION=1.0.0 PROJ_VERSION_CODE=1 PROJ_WEBSITEURL=http://xuyushi.github.io PROJ_ISSUETRACKERURL=http://xuyushi.github.io PROJ_VCSURL=http://xuyushi.github.io PROJ_DESCRIPTION=demo apps for embracing android studio PROJ_LICENCE_NAME=The Apache Software License, Version 2.0 PROJ_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt PROJ_LICENCE_DEST=repo DEVELOPER_ID=xuyushi DEVELOPER_NAME=xuyushi DEVELOPER_EMAIL=xmuy166@gmail.com
在 build.gradle 添加上传功能
apply plugin: 'maven' uploadArchives { repositories.mavenDeployer { repository(url: LOCAL_REPO_URL) pom.groupId = PROJ_GROUP pom.artifactId = PROJ_ARTIFACTID pom.version = PROJ_VERSION } }
在 app module 中使用插件
在项目的 buildscript 添加插件作为 classpath
buildscript { repositories { maven{ url 'file:///Users/your-user-name/Documents/Android/repo/' } jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.1.0-alpha3' classpath 'com.as-gradle.demo:gradleplugin:1.0.0' } }
在 app module 中使用插件
apply plugin: 'com.asgradle.apkdist'
加 app gradle 文件中加上项目需要的参数结构
apkdistconf { nameMap { name -> println 'hello,' + name return name } destDir 'your-distribution-dir' }
命令行运行
$ ./gradlew -p app apkdist :app:apkdist hello, world! hello, wow! your-distribution-directory
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Gradle插件开发系列之开发第一个gradle插件
- (是时候开发属于自己的插件了)数据校验插件开发指南
- IDEA 插件:多线程文件下载插件开发
- 从头开发一个Flutter插件(二)高德地图定位插件
- Gradle插件开发系列之gradle插件调试方法
- WordPress插件开发 -- 在插件使用数据库存储数据
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Web开发敏捷之道
Sam Ruby、Dave Thomas、David Heineme Hansson / 慕尼黑Isar工作组、骆古道 / 机械工业出版社 / 2012-3-15 / 59.00元
本书第1版曾荣获Jolt大奖“最佳技术图书”奖。在前3版的内容架构基础上,第4版增加了关于Rails中新特性和最佳实践的内容。本书从逐步创建一个真正的应用程序开始,然后介绍Rails的内置功能。全书分为3部分,第一部分介绍Rails的安装、应用程序验证、Rails框架的体系结构,以及Ruby语言的知识;第二部分用迭代方式创建应用程序,然后依据敏捷开发模式搭建测试案例,最终用Capistrano完成......一起来看看 《Web开发敏捷之道》 这本书的介绍吧!