作为一个Android开发者,知道gradle是用来构建Android项目的,一开始在学校的时候,没怎么关注并使用过gradle,现在工作发现gradle配置、插件等等,是一个很强大的工具。因此就开始了学习之路,这边介绍一下如何使用idea开发一个Gradle插件并将其上传至本地maven库,这样本地就可以使用这个插件了。
Gradle插件是什么
我们初创一个Android项目,其中每个module的build.gradle文件顶部有这样一行代码:
代码语言:javascript复制apply plugin:'com.android.application'
这里com.android.application就是一个gradle插件,它用来编译Android项目,因为原生的gradle并不是用来构建android项目的,因此谷歌实现了一个构建android的插件。 那么gradle项目本身支持的插件有:java、groovy、scala、maven等等。
开发gradle插件
由于我们项目中经常需要在构建过程中一些操作,比如aop,在apk生成后加固等等,因此开发了一些gradle插件来完成这样的事情。那么开发一个gradle插件的流程如下:
- 本地创建一个文件,比如说firstplugin,进入到该目录,执行以下命令
gradle init --type groovy-library
上面的代码会创建一个groovy-library项目,因为gradle插件有一些目录结构的要求,采用这种方式再修改,比较简单一点。
将生成的build.gradle文件改成以下内容:
代码语言:javascript复制buildscript {
repositories {
maven { url 'http://jcenter.bintray.com' }
}
dependencies {
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:0.6'
}
}
plugins {
id 'groovy'
id 'idea'
id 'maven'
id 'maven-publish' //该插件可以将打包的jar发送到maven库
}
repositories {
jcenter()
mavenCentral()
}
dependencies {
compile localGroovy()
compile gradleApi()
}
publishing{
publications{
plugin(MavenPublication){
from components.java
group 'com.xingfeng'
artifactId 'firstplugin'
version '1.0.0'
}
}
}
这里我们开发的gradle插件是一个二进制插件,别人如果想使用,和类库是一样的,需要提供group:artifactId:version,publishing{}标签里的就是上传至本地仓库时的版本信息。 使用本地配置的gradle和groovy版本;
- 创建文件结构 在src/main/groovy目录下创建包名,插件类。 在main目录下创建resources/META-INF/gradle-plugins目录,创建插件对应的配置文件,如下图所示:
开发gradle插件需要遵循上面的目录结构。
其中配置文件的红色部分就是该插件的id,上面介绍的Android Plugin的id是"com.android.application",其内容如下:
代码语言:javascript复制implementation-class=com.xingfeng.FirstPlugin
key是implementation-class,值就是插件名,包含全限定名。
- 开发插件;
package com.xingfeng;
import org.gradle.api.Plugin
import org.gradle.api.Project
class FirstPlugin implements Plugin<Project>{
@Override
void apply(Project project){
println 'hello world'
}
}
- 发布插件;开发完就可以执行publishToMavenLocal任务,将插件打包发布到本地Maven库。
gradle publishToMavenLocal
至此,发布成功,可以到.m2目录下查看是否有该库。
使用插件
使用插件,首先需要在buildscript{}里加上仓库和classpath,
代码语言:javascript复制buildscript {
repositories {
mavenLocal()
}
dependencies {
classpath 'com.xingfeng:firstplugin:1.0.0'
}
}
然后可以在项目的gradle文件中加入:
代码语言:javascript复制apply plugin:'com.xingfeng.firstplugin'
执行gradle build命令,可以看到打印出了hello world字样。
自动化shell脚本
上面的流程可以发现很多都是机械性的操作,作为一个程序员,不能容忍这些事情的发生,决定写一个程序将其自动化,然后再手动修改某些地方就ok了。本来决定用java写的,不知道怎么回事,执行命令总不成功,后来就转成shell脚本了。
环境要求
mac、groovy、maven、java
shell脚本
代码语言:javascript复制DIR=$1
PLUGINNAME=$2
mkdir ${DIR}
cd ${DIR}
gradle init --type groovy-library
#修改build.gradle
rm build.gradle
echo "buildscript{" >> build.gradle
echo "repositories{" >> build.gradle
echo "maven{url 'http://jcenter.bintray.com'}" >> build.gradle
echo "}n" >> build.gradle
echo "dependencies{" >>build.gradle
echo "classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:0.6'" >> build.gradle
echo "}n}n" >> build.gradle
echo "plugins{" >> build.gradle
echo "id 'groovy'" >>build.gradle
echo "id 'idea'" >>build.gradle
echo "id 'maven'">>build.gradle
echo "id 'maven-publish'">>build.gradle
echo "}n" >>build.gradle
echo "repositories{">>build.gradle
echo "jcenter()">>build.gradle
echo "mavenCentral()}">>build.gradle
echo "dependencies{">>build.gradle
echo "compile localGroovy()">>build.gradle
# echo "testCompile 'org.spockframework:spock-core:1.0-groovy-2.4'">>build.gradle
echo "compile gradleApi()">>build.gradle
echo "}n">>build.gradle
echo "publishing{">>build.gradle
echo "publications{">>build.gradle
echo "plugin(MavenPublication){">>build.gradle
echo "from components.java">>build.gradle
echo "group 'xxxxxx'">>build.gradle
echo "artifactId 'xxxx'" >>build.gradle
echo "version 'xxxx'">>build.gradle
echo "}n}n}">>build.gradle
#删除test目录
cd src
rm -r -f test
#创建plugin class
cd main
echo "import org.gradle.api.Plugin">>groovy/${PLUGINNAME}.groovy
echo "import org.gradle.api.Project">>groovy/${PLUGINNAME}.groovy
echo "class ${PLUGINNAME} implements Plugin<Project>{">>groovy/${PLUGINNAME}.groovy
echo "@Override">>groovy/${PLUGINNAME}.groovy
echo "void apply(Project project){">>groovy/${PLUGINNAME}.groovy
echo "}n}">>groovy/${PLUGINNAME}.groovy
rm groovy/Library.groovy
#创建resources目录
mkdir -p resources/META-INF/gradle-plugins
cd resources/META-INF/gradle-plugins
echo 'implementation-class=xxxxxxxx' > xxxxxx.properties
可以发现这里shell脚本是要求两个参数的,第一个参数是目录名,第二个参数是插件名(不包含包名),如果还想增加包名什么的,也是可以再加参数的。
运行
这里举个例子:
代码语言:javascript复制sh plugintemplate.sh Test FirstPlugin
运行结果如下:
生成的目录结构如上图,可以用idea打开项目格式化一下代码,不然很难看。 其中xxxxx是需要修改的地方。
总结
这里介绍的是一个开发流程,gradle插件开发目录需要遵守,不然就算上传成功了,使用插件的项目有可能会找不到plugin id的,比如说配置文件的目录结构错了,就会发生这种情况。别问我怎么知道的,因为我就这么sb过。
关于shell脚本可以到我的Github查看,地址是:https://github.com/wangli135/GradlePluginTemplate.git
GradlePluginTemplate 详细X
没有英汉互译结果 请尝试网页搜索