python自动更新pom文件
作者:互联网
自定义实现版本更新
- 作为一个专业懒人,我还是觉得idea的插件不够智能,确切的说还不够自动化。之前我已经动手实现了防 jenkins 自动打包上传启动服务的脚本的功能了,难道提交合并代码这种简单的事情还需要我自己处理吗。不得不承认代码冲突了的确还是需要认为干涉的,但是在平时开发中有多少概率会发生代码冲突呢?我们都是分工合作基本上代码冲突概率很低。
- 关于代码提交,自己分支如何合并到dev, 如何保证自己分支代码最新等等这些场景我们只需要通过脚本来进行自动化操作就行了。针对这些功能场景我大概写了两个脚本
batfhmerge.sh
和batchgrade.sh
就搞定了。 - 然而我想说的是关于项目的版本如何升级。上面也提到了我们分工合作就必然涉及到别人使用你的jar的场景了。你可以使用
SNAPSHOT
版本来保证别人拉取到你最新的功能代码,但是有些公司会要求使用非SNAPSHOT
版本进行管理也就是正式版本,这样做的好处就是容易找到之前的版本代码功能。
SHELL 实现
- 之前用SHELL 实现了自动更新置顶项目的版本号为最新日期后缀。虽然使用起来没发现有什么BUG, 但是感觉代码实现上还是很弱智的。
# 该脚本主要用来升级发包期间修改各服务版本
FILEPATH=$1
GROUPID=$2
ARTIFACTID=$3
FILENAME=$4
while getopts ":f:g:a:" opt
do
case $opt in
f)
FILENAME=$OPTARG
echo "您输入的文件配置:$FILENAME"
;;
g)
GROUPID=$OPTARG
echo "您输入的groupid配置:$GROUPID"
;;
a)
ARTIFACTID=$OPTARG
echo "您输入的artifactid配置:$ARTIFACTID"
;;
ff)
FILENAME=$OPTARG
echo "您输入的带修改文件为:$FILENAME"
;;
?)
echo "未知参数"
exit 1;;
esac
done
echo "开始修改版本号"
NEWCONTENT=1.2.5.$(date +%Y%m%d)
LINE=`cat ${FILENAME} | grep -n -A 1 '<groupId>'"${GROUPID}"'<\/groupId>'| grep -n '<artifactId>'"${ARTIFACTID}"'<\/artifactId>' | awk -F "[:-]+" '{print $2}'`
echo 具体行号:$LINE
if [[ -z $LINE ]]
then
echo 未匹配
exit
fi
VERSIONOLDCONTENT=`sed -n ''"$((LINE+1))"'p' ${FILENAME}| grep '[0-9a-zA-Z\.-]+' -Eo | sed -n '2p'`
echo ${VERSIONOLDCONTENT}
#gsed -i ''"$((LINE+1))"'c\'"${NEWCONTENT}"'' pom.xml
sed -i "" ''"$((LINE+1))"'s/'"${VERSIONOLDCONTENT}"'/'"${NEWCONTENT}"'/' ${FILENAME}
- 其实逻辑很简单,主要就是寻找
groupId
和artifactId
,最后确定好version
对应的行号将最新的日期后缀版本进行填充进去。 - 填充呢肯定需要三剑客中的
SED
进行操作,那就需要先获取到以前的旧版本,然后进行替换操作。
为什么使用SHELL
- shell脚本作为后端程序猿必备技能选择他进行实现也是为了温故下shell的知识。基本上脚本离不开三剑客,换句话说会了三剑客你就可以做好半个运维工作了。
- 有了这个脚本我每次在功能开发完成之后,会通过SHELL脚本进行版本升级以及自己分支合并到dev分支,这样方便别人获取到最新的代码。
python实现
- SHELL脚本定制度很高,很难做到自动的兼容功能。比如上面我们在定位包的时候是通过grep进行定位的,正常情况下应该是没什么问题的,但是当pom.xml 出现被注释的同名坐标时或者说名称存在其他相似度的情况下很难保证SHELl脚本还能够正确的解析出来。
- 除此之外还有一个重要的原因就是SHELL脚本很难在windows 运行,为了能够兼顾到windows电脑我决定用python 进行重新实现该功能。
文件思考
- 与SHELL不同的是 python处理需要考虑文件格式的问题。SHELL中不管什么格式都是通过三剑客进行定位处理,这是他的优点也是他的缺点。
- 首先我们得知道
pom.xml
文件他是一个 XML 格式的文件, XML=eXtensible Markup Language 。即是一种可扩展的标记语言。它与 JSON 一样主要用来存储和传输数据。在之前的Springboot章节中我们也实现了如何实现接口传递 XML 数据结构。
常见的 XML 编程接口有 DOM 和 SAX,这两种接口处理 XML 文件的方式不同,当然使用场合也不同。
Python 有三种方法解析 XML,SAX,DOM,以及 ElementTree:
### 1.SAX (simple API for XML )
Python 标准库包含 SAX 解析器,SAX 用事件驱动模型,通过在解析XML的过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件。
### 2.DOM(Document Object Model)
将 XML 数据在内存中解析成一个树,通过对树的操作来操作XML。
### 3.ElementTree(元素树)
- 而我所采用的就是最后一种方式
ElementTree
。
xml.etree.ElementTree
官网直通车
ElementTree
在 python3中已经作为标准库存在了,所以这里不需要我们额外的安装。
基于事件和基于文档的APID来解析XML,可以使用XPath表达式搜索已解析的文件,具有对文档的增删改查的功能,该方式需要注意大xml文件,因为是一次性加载到内存,所以如果是大xml文件,不推荐使用该模块解析,应该使用sax方式
- 不能说最好只能说他是合适的工具,因为
pom.xml
文件不会很大的。ElementTree
通过XPath
进行节点选择,所以关于xml 节点查找我们可以参考 xpath 语法即可。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.github.zxhTom</groupId>
<artifactId>bottom</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>bottom</name>
<url>http://maven.apache.org</url>
<description>最底层的繁琐封装</description>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<log4j2.version>2.10.0</log4j2.version>
</properties>
<dependencies>
<!-- 20180927提供了针对stirng bean list 等判断的操作。不用我们在详细的判断了 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.7</version>
</dependency>
<!-- 提供了针对list 等判断的操作。不用我们在详细的判断了 -->
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
</dependency>
<!-- jsonobeject jar包依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.28</version>
</dependency>
<!-- 日志记录 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j2.version}</version>
</dependency>
<!-- 通过反射获取标有注解的类 -->
<dependency>
<groupId>org.reflections</groupId>
<artifactId>reflections</artifactId>
<version>0.9.10</version>
</dependency>
</dependencies>
</project>
- 上面的
pom.xml
摘自于com.github.zxhTom
的 bottom 项目中。里面的恰好出现了注释,方便我们后期测试。