有三种方式可以定义Gradle插件:
直接在build脚本中定义。
在已有的项目中新建一个module,目录必须是rootProjectDir/buildSrc/src/main/groovy。
在一个单独的项目中新建一个module,目录必须是rootProjectDir/自定义/src/main/groovy。
前两种比较局限,只能在本项目中使用,第三种方式可以将插件打成JAR包,给其他项目使用。
第二种方式可以查看我的demo–AndroidStudy,本文主要介绍第三种方式中的一种,将Gradle插件发布到Gradle开源社区。当然你也可以上传到本地仓库。
首先新建一个Android项目,然后创建一个module,然后保证目录结构如下:
坑很多,请仔细看:
1.不需要main下的java目录,新建一个groovy目录。
2.在main下新建一个resources目录,在resources目录下再新建META-INF目录,再在META-INF目录下新建文件夹gradle-plugins,然后定义一个属性文件,我这里叫com.example.tsnt.create_activity_plugin.properties,内容如下:
// "="后面写上你要发布的插件的全类名
implementation-class=com.example.tsnt.plugin.CreateActivityPlugin
这里取的属性文件名的前缀com.example.tsnt.create_activity_plugin就是将要发布的插件ID。
3.设置build.gradle文件:
// First, apply the publishing plugin
buildscript {
repositories {
maven {
url "https://plugins.gradle.org/m2/"
}
}
dependencies {
classpath "com.gradle.publish:plugin-publish-plugin:0.9.10"
}
}
apply plugin: "com.gradle.plugin-publish"
apply plugin: 'groovy'
// Apply other plugins here, e.g. java plugin for a plugin written in java or
// the groovy plugin for a plugin written in groovy
// If your plugin has any external java dependencies, Gradle will attempt to
// downloaded them from JCenter for anyone using the plugins DSL
// so you should probably use JCenter for dependency resolution in your own
// project.
repositories {
jcenter()
}
dependencies {
compile gradleApi()
compile localGroovy() //not needed for Java plugins
// other dependencies that your plugin requires
}
// Unless overridden in the pluginBundle config DSL, the project version will
// be used as your plugin version when publishing
version = "0.0.2" // 你发布插件的版本号
group = "com.example.tsnt" // 你发布插件的组名
// The configuration example below shows the minimum required properties
// configured to publish your plugin to the plugin portal
pluginBundle {
website = 'https://github.com/tingshuonitiao/CreateActivityPlugin'
vcsUrl = 'https://github.com/tingshuonitiao/CreateActivityPlugin.git'
description = 'A plugin to create Activity!' // 你发布插件的描述
tags = ['Android', 'Create', 'Activity'] // 你发布插件的标签
plugins {
greetingsPlugin {
id = 'com.example.tsnt.create_activity_plugin' // 就是刚才定义属性文件时使用的ID
displayName = 'CreateActivityPlugin' // 添加依赖时使用的名字
}
}
}
你也可以直接参考脚本配置文档。
4.要发布插件,需要到Gradle官网注册一个账号,注册成功后进入到这样的页面:
这个时候很有可能你点击不了API Keys这个tab,那就(我一开始还以为是我没生成密钥),然后你会看到自己的key和secret,如下:
gradle.publish.key=kTcxxxxxxxF70
gradle.publish.secret=lnNaNyyyyyyyyyyzrM
在对应的module目录下新建一个 .gradle 文件夹,在文件夹下新建一个 gradle.properties 文件,把key和secret拷贝进去,如图:
我当时新建了 .gradle 文件夹,但是并不能在其目录下新建文件。
然后在插件的发布文档发现了这样一句话:
There is also an experimental task, “login“, that is part of the plugin publishing plugin, which automates this step.
然后点了下链接,跳转到刚才注册账号的网站,发现自动创建了gradle.properties文件,key和secret也在里面了。
5.然后我执行publishPlugins任务,提示成功了,很激动。然后去https://plugins.gradle.org/搜索,发现并没有我发布的插件。
我又执行一次publishPlugins任务,提示我已经上传过该版本的插件,该版本的插件已经存在,无需上传。
研究了好久,在插件的发布文档里看到如下的内容:
Some plugins require manual acceptance by the Plugin Portal maintainers, and will not be made available immediately when they are published. This is only the case when you have specified a custom “group ID” for your plugin artifact. The plugin publishing plugin will tell you if your plugin is pending acceptance when you publish.
If your plugin requires changes before it can be accepted, you will be contacted via the email address associated with your account. You will also receive an email when your plugin is accepted.
好吧,打扰了,原来定义一个新的group ID需要审核。
6.接下来的几天,我每天都去搜索我的插件,还是没搜索到。当然也没有收到告知我审核通过的邮件。
7.昨天,我突然想到要不把版本号改了试试?把版本号从0.0.1改成0.0.2,结果一下子就能搜索到这个插件了:
至于原因,What’s the fuck?
我发布的插件的功能显而易见就是创建一个Activity,感兴趣的朋友可以使用一下我这个插件试试,有两种依赖方式:
Build script snippet for plugins DSL for Gradle 2.1 and later:
plugins {
id "com.example.tsnt.create_activity_plugin" version "0.0.2"
}
发现这个id就是在插件build.gradle文件中定义的,也是属性文件使用的前缀。
Build script snippet for use in older Gradle versions or where dynamic configuration is required:
buildscript {
repositories {
maven {
url "https://plugins.gradle.org/m2/"
}
}
dependencies {
classpath "gradle.plugin.com.example.tsnt:create-activity-plugin:0.0.2"
}
}
apply plugin: "com.example.tsnt.create_activity_plugin"
这里能够看到分组和分组后的名字也是在插件build.gradle文件中定义的。
依赖并加载好我的插件,然后请在你项目的主module的build.gradle中添加如下配置:
activitySetting {
applicationId = "xxxx.xxxx.xxxx" // 你的applicationId
packageName = "gradle" // 某个模块的文件名
activityName = "Gradle" // 要新建的Activity的名字
}
然后执行一下createActivity这个Task,发现在对应的目录下生成了Activity的类文件和xml文件,并且在AndroidManifest中加入了这个新创建的Activity的节点。
哈哈,是不是感觉很神奇?
想看源码的同志,请点击CreateActivityPlugin,注释应该写的还够详细。
ps :最近又写了一个AndroidStudio插件FirstIntellijPlugin来一键创建Activity,使用起来更为优雅。了解可以点击第一个AndroidStudio插件,一键创建Activity。