开发Gradle插件并上传至本地maven库

作为一个Android开发者,知道gradle是用来构建Android项目的,一开始在学校的时候,没怎么关注并使用过gradle,现在工作发现gradle配置、插件等等,是一个很强大的工具。因此就开始了学习之路,这边介绍一下如何使用idea开发一个Gradle插件并将其上传至本地maven库,这样本地就可以使用这个插件了。

Gradle插件是什么

我们初创一个Android项目,其中每个module的build.gradle文件顶部有这样一行代码:

apply plugin:'com.android.application'

这里com.android.application就是一个gradle插件,它用来编译Android项目,因为原生的gradle并不是用来构建android项目的,因此谷歌实现了一个构建android的插件。 那么gradle项目本身支持的插件有:java、groovy、scala、maven等等。

开发gradle插件

由于我们项目中经常需要在构建过程中一些操作,比如aop,在apk生成后加固等等,因此开发了一些gradle插件来完成这样的事情。那么开发一个gradle插件的流程如下:

  1. 本地创建一个文件,比如说firstplugin,进入到该目录,执行以下命令
gradle init --type groovy-library

上面的代码会创建一个groovy-library项目,因为gradle插件有一些目录结构的要求,采用这种方式再修改,比较简单一点。

将生成的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版本;

  1. 创建文件结构 在src/main/groovy目录下创建包名,插件类。 在main目录下创建resources/META-INF/gradle-plugins目录,创建插件对应的配置文件,如下图所示:

开发gradle插件需要遵循上面的目录结构。

其中配置文件的红色部分就是该插件的id,上面介绍的Android Plugin的id是"com.android.application",其内容如下:

implementation-class=com.xingfeng.FirstPlugin

key是implementation-class,值就是插件名,包含全限定名。

  1. 开发插件;
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'
    }

}
  1. 发布插件;开发完就可以执行publishToMavenLocal任务,将插件打包发布到本地Maven库。
gradle publishToMavenLocal

至此,发布成功,可以到.m2目录下查看是否有该库。

使用插件

使用插件,首先需要在buildscript{}里加上仓库和classpath,

buildscript {
    repositories {
        mavenLocal()
    }
    dependencies {
        classpath 'com.xingfeng:firstplugin:1.0.0'
    }
}

然后可以在项目的gradle文件中加入:

apply plugin:'com.xingfeng.firstplugin'

执行gradle build命令,可以看到打印出了hello world字样。

自动化shell脚本

上面的流程可以发现很多都是机械性的操作,作为一个程序员,不能容忍这些事情的发生,决定写一个程序将其自动化,然后再手动修改某些地方就ok了。本来决定用java写的,不知道怎么回事,执行命令总不成功,后来就转成shell脚本了。

环境要求

mac、groovy、maven、java

shell脚本

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脚本是要求两个参数的,第一个参数是目录名,第二个参数是插件名(不包含包名),如果还想增加包名什么的,也是可以再加参数的。

运行

这里举个例子:

sh plugintemplate.sh Test FirstPlugin

运行结果如下:

生成的目录结构如上图,可以用idea打开项目格式化一下代码,不然很难看。 其中xxxxx是需要修改的地方。

总结

这里介绍的是一个开发流程,gradle插件开发目录需要遵守,不然就算上传成功了,使用插件的项目有可能会找不到plugin id的,比如说配置文件的目录结构错了,就会发生这种情况。别问我怎么知道的,因为我就这么sb过。

关于shell脚本可以到我的Github查看,地址是:https://github.com/wangli135/GradlePluginTemplate.git

GradlePluginTemplate 详细X

没有英汉互译结果 请尝试网页搜索

原文发布于微信公众号 - 每天学点Android知识(android_every_day)

原文发表时间:2019-01-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券