本文章向大家介绍开发Gradle插件并上传至本地maven库,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
作为一个Android开发者,知道gradle是用来构建Android项目的,一开始在学校的时候,没怎么关注并使用过gradle,现在工作发现gradle配置、插件等等,是一个很强大的工具。因此就开始了学习之路,这边介绍一下如何使用idea开发一个Gradle插件并将其上传至本地maven库,这样本地就可以使用这个插件了。
我们初创一个Android项目,其中每个module的build.gradle文件顶部有这样一行代码:
apply plugin:'com.android.application'
这里com.android.application就是一个gradle插件,它用来编译Android项目,因为原生的gradle并不是用来构建android项目的,因此谷歌实现了一个构建android的插件。 那么gradle项目本身支持的插件有:java、groovy、scala、maven等等。
由于我们项目中经常需要在构建过程中一些操作,比如aop,在apk生成后加固等等,因此开发了一些gradle插件来完成这样的事情。那么开发一个gradle插件的流程如下:
gradle init --type groovy-library
将生成的build.gradle文件改成以下内容:
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版本;
其中配置文件的红色部分就是该插件的id,上面介绍的Android Plugin的id是"com.android.application",其内容如下:
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'
}
}
gradle publishToMavenLocal
使用插件,首先需要在buildscript{}里加上仓库和classpath,
buildscript {
repositories {
mavenLocal()
}
dependencies {
classpath 'com.xingfeng:firstplugin:1.0.0'
}
}
然后可以在项目的gradle文件中加入:
apply plugin:'com.xingfeng.firstplugin'
执行gradle build命令,可以看到打印出了hello world字样。
上面的流程可以发现很多都是机械性的操作,作为一个程序员,不能容忍这些事情的发生,决定写一个程序将其自动化,然后再手动修改某些地方就ok了。本来决定用java写的,不知道怎么回事,执行命令总不成功,后来就转成shell脚本了。
mac、groovy、maven、java
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
这里举个例子:
sh plugintemplate.sh Test FirstPlugin
运行结果如下:
GradlePluginTemplate 详细X