Gradle自定义插件介绍2

步骤4.创建插件实现的任务:上传版本信息class uploadtask extends defaulttask{ string url = 'http://127.0.0.1/api/v3/upload/version' @taskaction void upload(){ //1.获取版本信息 def version = getcurrentversion() //2.发送版本信息 def response = sendandreceive(version) //3.处理响应:将版本信息以及响应写入到本地文件中// checkresponse(response) } //1.获取版本信息 def getcurrentversion(){ def name = project.extensions.versioninfo.versionname def code = project.extensions.versioninfo.versioncode def info = project.extensions.versioninfo.versionupdateinfo println name:$name code:$code info:$info return new versioninfo(versionname: name, versioncode: code, versionupdateinfo: info) } //2.发送版本信息 void sendandreceive(versioninfo version){ okhttpclient client = new okhttpclient() formbody body = new formbody.builder() .add('versionname',version.versionname) .add('versioncode',+version.versioncode) .add('versionupdateinfo',version.versionupdateinfo) .build() request.builder builder = new request.builder() .url(url) .post(body) def call1 = client.newcall(builder.build()) call1.enqueue(new callback() { @override void onfailure(@notnull call call, @notnull ioexception e) { println push version fail:reason:+e.message } @override void onresponse(@notnull call call, @notnull response response) throws ioexception { checkresponse(response); } }) } //3.处理响应:将版本信息以及响应写入到本地文件中 void checkresponse(response){ println response:+new string(response.body().bytes()) }}记住,在需要执行的方法上面添加taskaction注解:在我们任务执行的时候就会执行到这个方法。
步骤5.将插件扩展和插件任务集成到project生命周期中@overridevoid apply(project project) { println begin:now this is a ${project.name} 's upload plugin //1.在插件中引入extensions中的字段,就是我们project中配置的扩展字段 project.extensions.create(extensive,versioninfo.class) //2.创建待处理的task project.tasks.create(task_name,uploadtask.class) //3.将uploadtask任务挂架到project的生命周期中 def build = project.tasks.getbyname('clean') def uploadtask = project.tasks.getbyname(task_name) //这里使用dependson强依赖任务关系 build.dependson(uploadtask)}步骤6.插件发布笔者为了测试,将jar包只发布在本地,测试使用。
使用如下方式发布:
gradleplugin { plugins { modularplugin { id = 'com.yuhb.upload' implementationclass = 'com.yuhb.upload.uploadversionplugin' } }}这个配置在build后自动生成resources文件:这个插件扩展配置是引入的:java-gradle-plugin中。
resources文件自动生成.png
当然也可以直接在resources文件夹中上手动写入该文件
在插件的build.gradle实现下面的逻辑:
uploadarchives { repositories { mavendeployer { repository(url:uri('d:/maven_local')) pom.groupid = 'com.yuhb.upload' pom.artifactid = 'uploader' pom.version = '1.0.0' } }}在命令行执行:
./gradlew :uploadversion:uploadarchives然后去本地文件夹下面看看是否上传成功:
本地文件成功.png
这里要说明下:
一般情况下都会将自定义插件发布到maven私服或者中央仓库,才可以供其他项目使用
关于如何发布到maven私服,可以查看这篇文章
后期也会出一期文章教大家如何将数据发布到中央仓库
步骤7.插件引入步骤1 :在工程的根build.gradle文件中引入:buildscript { repositories { ... maven { url uri('d:/maven_local') } } dependencies { ... classpath 'com.yuhb.upload:upload:1.0.0' }}说明:
com.yuhb.upload:uploader:1.0.0格式:
引入字段发布字段
com.yuhb.upload pom.groupid
uploader pom.artifactid
1.0.0 pom.version
步骤2 :在子project中引入插件:apply plugin: 'com.yuhb.upload'步骤3 :配置extensive插件扩展:versioninfo { versionname = '1.0.0' versioncode = 1 versionupdateinfo = '当前是第一个版本:初始apk'}这个versioninfo扩展是怎么来的呢?
我们看下之前我们配置插件的时候,使用了:
extensive = 'versioninfo'project.extensions.create(extensive,versioninfo.class)在插件中引入extensions中的字段,就是我们project中配置的扩展字段:
versioninfo { versionname = '1.0.0' versioncode = 1 versionupdateinfo = '当前是第一个版本:初始apk'}就是这里,如果外部配置了versioninfo的扩展字段,就会通过project.extensions获取到,并将数据写入project.extensions的versioninfo属性中:之后就可以使用project.extensions的versioninfo属性访问外部传入的配置数据:
def name = project.extensions.versioninfo.versionnamedef code = project.extensions.versioninfo.versioncodedef info = project.extensions.versioninfo.versionupdateinfo步骤4 :运行root的build 任务查看编译信息:./gradlew build结果:> task :app:uploadtaskname:1.0.0 code:1 info:当前是第一个版本:初始apk这里运行build可以执行插件中的任务是因为前面笔者将插件task挂接到了build任务之前:
挂接代码:
//3.将uploadtask任务挂架到project的生命周期中def build = project.tasks.getbyname('build')def uploadtask = project.tasks.getbyname(task_name)//这里使用dependson强依赖任务关系build.dependson(uploadtask)项目demo完整代码已经上传github:
https://github.com/byteyuhb/a_gradle_plugin_sample
5.总结本文主要针对我们自定义插件定义以及优势做了一些说明,且使用一个实战项目对自定义插件制作,发布,引入流程做了一个详细的讲解
,gradle插件部分还有gradle的上传流程和agp插件讲解没有讲,后面都会陆续推出。
参考资料gradle自定义插件
_官网文档
using gradle plugins _ gradle 官方文档
gradle 系列(2)手把手带你自定义 gradle 插件_胡飞洋
好了,本文就讲解到这里了。

OpenAI到底做对了什么?OpenAI发展的5大技术路线
蓝牙耳机选什么品牌好、不同价位蓝牙耳机差距有多大
MTN与中兴通讯签署跨境骨干传输网络改造商用合同
深开鸿加速推进OpenHarmony生态建设
四款车型深深打动消费者 远航汽车引领高端新能源汽车市场创新发展
Gradle自定义插件介绍2
索尼PS5在日本市场累计销量突破1800万台
MEC 为什么在 5G 时代变得重要?
首届EIMS2021圆满收官,整装待发明年3月深圳再相聚!
智能型污水管水中臭氧传感器怎么使用 有哪些功能特点?
iPhone8什么时候上市?iphone 8包装盒、价格、配色曝光,外观确定,将配置全面屏+面部识别+无线充电+A11
蓝牙Mesh照亮智能楼宇的未来
红米K40系列价格提前曝光 下月即将发布
On chip ESD和EOS保护设计
开发可以识别Covid-19新型疗法的机器学习方法
UWB室内定位系统TDOA算法方案介绍
BOXER-8621AI搭载NVIDIA Jetson Orin Nano,引爆边缘计算再进化
硬件加速边缘检测优化处理方案
施耐德断路器的种类有哪些
先验概率和代价函数均模糊时基于贝叶斯最小风险准则的分布式决策