自定义gradle插件从入门到放弃
最近参与基础架构组的crashly收集项目,其中一个环节就是收集项目中使用到的公司内部的依赖库和混淆后的mapping文件, 然后调用python文件实现文件和数据字段的上传。请求网络上传数据这块python使用的代码量非常少就几行代码的事情,所以我在项目中使用了两个.gradle文件分别扫描依赖过滤内部的依赖库和mapping文件,然后在.gradle文件中的task中调用python文件上传数据,这样工作就告一段落,然后当我找QA和负责打包的同事提交我的几个文件时才知道我这做法是多么lowbee, 这个功能每个业务线的项目都分别接入我的几个.gradle文件和.py文件,然后每次.gradle和.py文件修改在提交上去,然后各个业务线需要拉去最新的代码,这样的话我需要把各个业务线的项目源码都荡到我本地,挨个改一遍在提交,这种做法没有做到通用性和可维护性。在同事的建议下,我又硬着头皮开始研究自定义gradle插件化,然后每个业务线只需要apply我的插件就可以,这个方案不错,然后我就gg了,经过两天的倒腾,总算是实现了功能。
首先说下功能吧,就是我这边定义2个任务,其中一个任务就是扫描业务方的项目过滤出使用公司内部的依赖,然后然后生成一个文件,连同参数一起上传到后台,单单使用python文件上传几行代码的事。
但是这里遇到了2个问题:
1. 在插件module下的python文件在插件中是没法访问的,插件中是很容易拿到业务方的目录,如果将python文件放在业务方的项目中,同样是扩展性不好
2. 在插件中上传文件和其他参数我引入了第三方库的依赖,执行 uploadArchives 任务将代码上传到本地仓库后,在业务方demo中报错,无法访问到插件中的依赖。
我在技术群里问了几遍结果都没有人回应,仅有的一个同行回复是遇到类似的问题,然后他的建议是去网上下载一个有类似功能的demo,然后修改下逻辑。顺着这条线索我去网上找到第四个才算是试成功了,下面将操作过程重演一遍。
1) 首先新建一个Library库,删掉里面的文件最后保留和新建的文件夹如下图所示:
2) 删掉build.gradle中的内容,最终配置如下所示:
3) 在groovy文件夹下新建包名并在该名下新建文件CrashlyPlugin.groovy, 内容如下:
4) 在gradle-plugins文件夹下新建一个文件com.ke.crashly.plugin.properties, 内容如下:
5) sync一下项目,然后找到开发工具右侧的Gradle下的:crashlyplugin -> Tasks -> upload -> 双击uploadArchives,就会在当前项目下生成一个目录crashlyrepo, 接下来就可以在项目中使用这个插件了;
6) 在工程的根目录下的build.gradle文件下添加如下代码:
7) 在工程的主module的build.gradle文件最后添加如下代码:
8) sync一下工程,同样是在开发工具右侧的Gradle标签下,找到:app -> Tasks -> other -> uploadRepoNameForCrashly控制台就会打印百度首页网页代码,也可以在Terminal下输入命令: gradle task -q uploadRepoNameForCrashly -s.