前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >开发Gradle插件并上传至本地maven库

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

作者头像
用户1108631
发布2019-08-14 17:08:05
2.7K0
发布2019-08-14 17:08:05
举报

作为一个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插件的流程如下:

  1. 本地创建一个文件,比如说firstplugin,进入到该目录,执行以下命令
代码语言:javascript
复制
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版本;

  1. 创建文件结构 在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,值就是插件名,包含全限定名。

  1. 开发插件;
代码语言:javascript
复制
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库。
代码语言:javascript
复制
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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-01-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 每天学点Android知识 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Gradle插件是什么
  • 开发gradle插件
  • 使用插件
  • 自动化shell脚本
    • 环境要求
      • shell脚本
        • 运行
        • 总结
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档