我做了款组件上传的插件

简介: 我做了款组件上传的插件

做这款插件确实有点吃饱了没事干的嫌疑,毕竟 maven-publish 已经提供了很好的支持,但一想到每次都要写一遍那一大段的 publishing 又会觉得,能省几行代码是几行代码,也看过其他人将 publishing 相关的内容抽离到一个独立的 gradle 文件中,想用的时候再 apply from 引入一下,但始终觉得,这种每次都要拷贝文件到仓库的方式显得太麻烦,就没有那种直接申明 GAV 就可以上传的嘛?所以,我就想到了开发这个插件。

在之前有写过一篇《用 Github 实现组件自动发布》,这篇主要是利用 Github Actions 去构建组件,从标准交付流程来看,通过自动化构建是最合理的,但为了学习(主要是吃了没事干),硬是用 gradle 去实现了下发布组件到 github。


目前上传插件支持两种方式上传:


  • uploadGithub :  上传 aar 到 github 仓库
  • uploadMaven :上传 aar 到 Maven Nexus 仓库

当然,在写这款插件也遇到了一些问题,顺便也总结一下,最后再说一下如何接入这款插件。


问题记录


1、project exec commandLine 问题


在做 uploadGithub 插件时,在组件打包完成后,需要将配置的仓库 clone 到本地,然后将 aar 文件拷贝到仓库目录中,然后再将组件 aar 上传到配置的仓库,但在执行 git add ${aar 文件} 命令时没有任何反应,即使使用 git add . 也不行,起初怀疑是自己的 workingDir 设置的有问题,所以,尝试了下新建文件的命令 touch a.txt 来看看是否能生效,试了下是成功的,在仓库的目录生成了 a.txt 文件,这就让我百思不得其解。 为了不让自己思路进入死胡同,转而使用 eclipse 开源的 JGit 来实现,JGit 是一款 java 实现的用来操作 Git 的轻量库,本来想直接用 JGit 来操作整个 Git 流程的,但在用 JGit clone ssh 项目时,又出现了 The remote end hung up unexpectedly while git cloning 问题,在各种搜索中,stackoverflow 也是给出了 git config --global http.postBuffer 524288000 的设置,但在尝试后依然无果。 最终,整个 Git 链路写成了:


  • commandLine 实现 git clone 项目到本地
  • JGit 实现 aar 文件的 git add
  • JGit 实现 aar 文件的 git commit
  • commandLine 实现 git push origin branch

果然丑陋,哭了


2、hasPomDependencies


为了支持将模块组件依赖的 dependencies 也打入 pom 文件中,读取了 project 下的 dependencies 来拿到模块下的依赖,然后再拿到依赖的 GAV appendNode 到 dependency 节点中,但在实践到 implements project(":java-lib") 时发现,他是没有 GAV 的,所以,打入到 pom 中的他是长这个样子的:


<dependency>
      <groupId>pluginDemo</groupId>
      <artifactId>java-lib</artifactId>
      <version>unspecified</version>
      <scope>compile</scope>
 </dependency>
复制代码


显然,这种 unspecified 未指定的版本和不存在的 groupId 是无法被其他小伙伴给使用的,即使想拉这个组件也拉不下来。


后来想到曲线救国的方式,java-lib 这个组件不是也要对外发布嘛,那我直接读取 java-lib 的 build.gradle 中的 GAV 不也可以嘛,所以,这个地方又判断了下 dependency 是否是 DefaultProjectDependency,如果是的话,就读取该 dependency 目录下的 build.gradle 文件,然后用正则的方式把 GAV 给匹配出来,然后设置到 pom 文件中


接入插件:


一、配置 maven 镜像源和依赖


buildscript {
    repositories {
        ...
        // 配上 maven 源
        maven{
           url "https://raw.githubusercontent.com/MRwangqi/Maven/main"
        }
    }
    dependencies {
        classpath "com.android.tools.build:gradle:7.0.4"
        // 依赖 upload 插件
        classpath "com.github.MRwangqi:uploadPlugin:1.0.0"
    }
}
复制代码

二、依赖插件


1、上传到 github


在模块工程的 build.gradle 中依赖插件:


plugins {
    id 'com.android.library'
    // 配置上传到 github
    id 'uploadGithub'
}
upload {
    // 必选
    groupId = ""
    // 必选
    artifactId = ""
    // 必选
    version = ""
}
复制代码


local.properties 配置:


# github 仓库链接(可选,如果不配置的话则发布到 project 下的 build/repo 目录)
githubURL = ""
# github 仓库分支(可选,如果不配置的话则以仓库当前配置的分支为准)
githubBranch = ""
复制代码


插件在运行时会读取 local.properties 中 github 的内容


2、上传到 maven


在模块工程的 build.gradle 中依赖插件:


plugins {
    id 'com.android.library'
     // 配置上传到 maven nexus
    id 'uploadMaven'
}
upload {
    // 必选
   groupId = ""
    // 必选
   artifactId = ""
    // 必选
   version = ""
}
复制代码


local.properties 配置:


// nexus 地址 (可选,如果不配置的话则发布到 project 下的 build/repo 目录)
   nexusURL = ""
   nexusName = ""
   nexusPsw = ""
复制代码


插件在运行时会读取 local.properties 中 nexus 的内容

uploadMaven 也支持通过命令参数来输入:


./gradlew :android-lib:upload -Pname=nexusName -Ppsw=${nexusPsw} -Purl=${nexusURL}


例如要打包 android-lib 模块,用户名和密码都是 admin,则命令行为:


./gradlew :android-lib:upload -Pname=admin -Ppsw=admin -Purl=http://localhost:8081/repository/android/


通用配置:


upload {   
   // 模块下的依赖是否打入 pom : (可选,默认会打入)
   hasPomDepend = true
   // 模块是否打入 source 源码: (可选,默认会打入)
   sourceJar = true       
}


目录
相关文章
|
Java Android开发
Android面试题经典之Glide取消加载以及线程池优化
Glide通过生命周期管理在`onStop`时暂停请求,`onDestroy`时取消请求,减少资源浪费。在`EngineJob`和`DecodeJob`中使用`cancel`方法标记任务并中断数据获取。当网络请求被取消时,`HttpUrlFetcher`的`cancel`方法设置标志,之后的数据获取会返回`null`,中断加载流程。Glide还使用定制的线程池,如AnimationExecutor、diskCacheExecutor、sourceExecutor和newUnlimitedSourceExecutor,其中某些禁止网络访问,并根据CPU核心数动态调整线程数。
413 2
|
数据采集 人工智能 搜索推荐
《AI大模型助力客户对话分析解决方案评测》
该方案详细描述了AI客服对话分析的实践原理和实施方法,涵盖数据采集、预处理、特征提取、语义理解及可视化展示等环节。方案提供了较为详细的实施步骤,但在模型选型、特殊数据处理等方面存在不足。部署过程中,用户在数据采集对接和模型训练优化方面遇到困惑,希望获得更多实际案例和操作指导。示例代码基本可用,但在函数计算和第三方库兼容性上存在报错。总体而言,方案能满足基本对话分析需求,但需在准确性、实时性、个性化分析和结果解释性方面进一步改进。
419 1
|
7月前
|
存储 缓存 Java
JUC并发—3.volatile和synchronized原理
本文介绍了volatile关键字的使用、主内存和CPU的缓存模型、CPU高速缓存的数据不一致问题、总线锁和缓存锁及MESI缓存一致性协议、Java的内存模型JMM、JMM如何处理并发中的原子性可见性有序性、volatile如何保证可见性、volatile为什么无法保证原子性、volatile如何保证有序性、volatile的原理(Lock前缀指令 + 内存屏障)、双重检查单例模式的volatile优化、基于volatile优化微服务的优雅关闭机制、优化微服务存活状态检查机制等 14.i++的多线程安全问题演示 1
|
Java Linux Maven
java依赖冲突解决问题之容器加载依赖jar包如何解决
java依赖冲突解决问题之容器加载依赖jar包如何解决
|
Linux 数据安全/隐私保护
Linux命令setfacl详解
`setfacl`是Linux中用于设置文件访问控制列表的命令,提供比传统权限更细粒度的控制。它允许为特定用户或组添加、修改或删除权限,适用于多用户环境和复杂场景。常用参数包括`-m`(修改规则)、`-x`(删除规则)、`-R`(递归设置)和`-d`(设置默认ACL)。例如,`setfacl -m u:user1:rw- file.txt`给用户`user1`赋予文件`file.txt`的读写权限。记得在使用前确认文件系统支持ACL,并谨慎规划和审查权限设置。
|
12月前
|
监控 安全 Devops
DevOps实践中,如何平衡开发速度和安全审核的效率
在DevOps实践中,为平衡开发速度与安全审核效率,可采取自动化安全测试、安全编码实践、持续监控与日志分析、集成安全工具、合规性代码审查、基础设施即代码、权限和访问控制、安全培训、漏洞及补丁管理和持续反馈改进等措施,确保高效安全的开发流程。
|
缓存 网络协议 Linux
Linux ip命令常用操作
Linux的 `ip`命令是一个强大且灵活的网络管理工具,能够执行从基本的网络接口配置到高级的路由和VLAN管理等多种操作。通过熟练掌握这些常用操作,用户可以更加高效地管理和配置Linux系统的网络环境。无论是在日常管理还是故障排除中,`ip`命令都是必不可少的工具。
237 2
|
SQL Oracle 关系型数据库
介绍 2款 Oracle 开发工具
介绍 2款 Oracle 开发工具
361 3
|
存储 Go C语言
Python 的整数是怎么实现的?这篇文章告诉你答案
Python 的整数是怎么实现的?这篇文章告诉你答案
274 7