「初学者商城」- 接口 - 一键升级版本号(优化)

1. 前言


目前每次更新,都需要在每一个工程的pom文件中更改版本号,有时候很容易漏改;而且这一改就是十几个地方,等后期模块变得越来越多,如果还是一个个改就真的有点上头了…所以版本号升级的优化方案就这么来了。


2. 源码


完整项目地址:https://github.com/intomylife/osc-api

v1.4.3 标签地址:https://github.com/intomylife/osc-api/releases/tag/v1.4.3

v1.4.3 下载地址:zip,tar.gz

注:对于标签的说明「初学者商城」- 写在最前面 #5.1


3. 接口


3.1 查看更改内容

  1. 统一配置版本号
  2. 各自配置版本号
  3. 使用脚本更新版本号

3.2 统一配置版本号

开始想着把版本号全部放在聚合服务工程中统一配置

  • 预期效果: 版本号都配置在一个文件中,容易维护,不会漏改
  • 实际结果: osc-service中能打包成功,但是base-service-core打包会失败,报错找不到${xxx.xxx},也就是可以打包父工程,无法打包子工程
  • 其他问题: 在子工程中的标签引入${}时 IDEA 会有警告:Properties in parent definition are prohibited,这个问题倒是好解决:打开 IDEA -> Preferences… -> 搜索prohibited -> 找到 Editor - Inspections -> 取消勾选 Maven - Usage of properties in parent description

3.3 各自配置版本号

无法打包这个问题很严重,查了很久也没找到合理的解决方案,迫不得已又改回版本号各自配置。就在准备放弃的时候,又突然发现了另一种解决方案

3.4 使用脚本更新版本号

最后发现,Maven有专门的命令来更新版本号:mvn versions:set

3.4.1 .sh

#!/bin/bash
## $() - 方法,${} - 变量

## 开始
echo [INFO] ----------------------------- start --------------------------------------

## 获取入参,版本号
new_versiont=$1
## 输出看一眼
echo new_versiont: ${new_versiont}

## 获取入参,是否需要备份(true | false)
is_bak=$2
## 输出看一眼
echo is_bak: ${is_bak}

## 非空判断
if [ $new_versiont ];
then

    ## 1. 更新 commons 工程版本号
    cd osc-commons/
    ## 获取当前工程的版本号
    ## old_version=$(mvn org.apache.maven.plugins:maven-help-plugin:3.2.0:evaluate -Dexpression=project.version -q -DforceStdout) 
    ## 输出看一眼
    ## echo old_version: ${old_version}
    ## 升级
    mvn versions:set -DoldVersion=* -DnewVersion=${new_versiont} -DgenerateBackupPoms=${is_bak} && mvn clean install

    ## 2. 更新 service 工程中的 commons 工程版本号
    cd ../osc-service/
    ## 获取当前工程的版本号
    ## old_version=$(mvn org.apache.maven.plugins:maven-help-plugin:3.2.0:evaluate -Dexpression=project.version -q -DforceStdout) 
    ## 输出看一眼
    ## echo old_version: ${old_version}
    ## 更新
    mvn versions:update-properties -DincludeProperties={osc.commons.version} -Dproperties=[${new_versiont}] -DgenerateBackupPoms=${is_bak}

    ## 3. 更新 service 工程版本号
    mvn versions:set -DoldVersion=* -DnewVersion=${new_versiont} -DgenerateBackupPoms=${is_bak}

	## 4. 返回根目录
    cd ../
    
    ## 结束
    echo [INFO] ----------------------------- end --------------------------------------

else

    ## 结束
    echo [INFO] -------------------------- 缺少参数 -------------------------------------

fi

非常简单的一个脚本文件:判断是否入参了版本号,如果有,就进行版本号的更新

如何使用:

  1. 点击IDEA底部的Terminal终端入口
  2. 进入到项目根目录
MacBook-Pro:osc-api zouwencong$ pwd
/Users/zouwencong/JavaWork/my_osc/osc-api
MacBook-Pro:osc-api zouwencong$ ls -all
total 64
drwxr-xr-x  13 zouwencong  staff   416 Jun  5 21:50 .
drwxr-xr-x   7 zouwencong  staff   224 Jun  6 16:22 ..
-rw-r--r--@  1 zouwencong  staff  8196 Jun  5 21:50 .DS_Store
drwxr-xr-x  15 zouwencong  staff   480 Jun  5 22:21 .git
-rw-r--r--   1 zouwencong  staff   428 Jun  4 11:47 .gitignore
drwxr-xr-x  11 zouwencong  staff   352 Jun  7 16:44 .idea
-rw-r--r--@  1 zouwencong  staff    33 Nov 15  2019 README.md
-rw-rw-rw-   1 zouwencong  staff  1622 Jun  5 22:04 growth-version.bat
-rwxrwxrwx@  1 zouwencong  staff  1649 Jun  5 22:11 growth-version.sh
drwxr-xr-x   4 zouwencong  staff   128 Jan 10 11:28 logs
-rw-rw-rw-   1 zouwencong  staff   122 Jun  5 22:04 old-version.bat
drwxr-xr-x  10 zouwencong  staff   320 Jun  5 15:29 osc-commons
drwxr-xr-x  14 zouwencong  staff   448 Jun  5 15:29 osc-service
MacBook-Pro:osc-api zouwencong$ 
  1. 输入命令./growth-version.sh 1.4.3 true:这时会把所有工程的版本号更改为1.4.3,而第二个参数true是指备份pom文件,当然脚本是测试很多次的,确保安全无误,所以从下次开始第二个参数可以指定为false

------------------- 2020.06.13 更新:归类脚本文件 -------------------

  1. 目录现在变成了这样
MacBook-Pro:osc-api zouwencong$ ls -all
total 40
drwxr-xr-x  11 zouwencong  staff    352 Jun 13 22:27 .
drwxr-xr-x   7 zouwencong  staff    224 Jun  6 16:22 ..
-rw-r--r--@  1 zouwencong  staff  10244 Jun 13 23:03 .DS_Store
drwxr-xr-x  15 zouwencong  staff    480 Jun 13 23:01 .git
-rw-r--r--   1 zouwencong  staff    428 Jun  4 11:47 .gitignore
drwxr-xr-x  11 zouwencong  staff    352 Jun 13 23:07 .idea
-rw-r--r--@  1 zouwencong  staff     33 Nov 15  2019 README.md
drwxr-xr-x   4 zouwencong  staff    128 Jan 10 11:28 logs
drwxr-xr-x  10 zouwencong  staff    320 Jun 13 18:34 osc-commons
drwxr-xr-x  14 zouwencong  staff    448 Jun 11 09:27 osc-service
drwxr-xr-x   5 zouwencong  staff    160 Jun 13 22:27 script
MacBook-Pro:osc-api zouwencong$
  1. 脚本文件都放在了script目录下,这时的命令就更改为./script/version/growth-version.sh 1.4.3 true

核心命令:

  1. mvn versions:set -DoldVersion=* -DnewVersion=${new_versiont} -DgenerateBackupPoms=${is_bak}:执行此命令会自动更新多模块中所有父模块子模块的版本号。更新为多少,取的是第一个入参${new_versiont};是否备份pom文件,取的是第二个入参${is_bak}
  2. mvn versions:update-properties -DincludeProperties={osc.commons.version} -Dproperties=[${new_versiont}] -DgenerateBackupPoms=${is_bak}:执行此命令会自动更新指定节点的属性值。首先这里更新目标是节点中的属性,然后会把值更新为多少,取的是第一个入参${new_versiont};是否备份pom文件,取的是第二个入参${is_bak}
  3. #1中着重标出【所有父模块子模块】是因为第一条命令不会自动更新引入的其他模块的版本号,在项目中,commons就属于其他模块工程;所以就需要使用第二条命令来单独的把service工程中配置的commons工程的版本号更新,是这样的:
	<properties>
		<!-- 公用工程版本号 -->
        <osc.commons.version>1.4.3</osc.commons.version>
    </properties>

	...
	
	<!-- commons 工程依赖 -->
	<dependency>
		<groupId>com.zwc</groupId>
		<artifactId>osc-commons</artifactId>
		<version>${osc.commons.version}</version>
	</dependency>

其它命令:

如果执行上面的命令并且入参是否备份选择的是true的话,就会导致在每个工程中都会出现一个*.versionsBackup文件,此文件就是自动备份的执行命令前的pom;这时

  1. 如果更新后的pom不是预期想要的,就可以使用命令mvn versions:revert来回滚
  2. 如果更新后的pom达到了预期效果,就可以使用命令mvn versions:commit来自动删除*.versionsBackup备份文件

细节的处理:

  1. 在更新commons工程版本号的时候还有这么一段&& mvn clean install,是因为如果只是单纯的更新commons工程的版本号,而不把它安装到本地仓库中,那么会导致,在后面更新service工程的时候找不到最新的commons工程依赖,就会报错

3.4.2 .bat

@echo off

REM ## 开始
echo [INFO] ----------------------------- start --------------------------------------

REM ## 获取入参,版本号
set new_versiont=%1%
REM ## 输出看一眼
echo new_versiont: %new_versiont%

REM ## 获取入参,是否需要备份(true | false)
set is_bak=%2%
REM ## 输出看一眼
echo is_bak: %is_bak%

REM ## 非空判断
if defined new_versiont (
    REM ## 1. 更新 commons 工程版本号
    cd osc-commons/
    REM ## 获取当前工程的版本号
    REM for /f "delims=" %%i in ('..\script\version\old-version.bat') do set old_version=%%i
    REM ## 输出看一眼
    REM echo old_version: %old_version%
    REM ## 升级
    mvn versions:set -DoldVersion=* -DnewVersion=%new_versiont% -DgenerateBackupPoms=%is_bak% && mvn clean install

    REM ## 2. 更新 service 工程中的 commons 工程版本号
    cd ../osc-service/
    REM ## 获取当前工程的版本号
    REM for /f "delims=" %%i in ('..\script\version\old-version.bat') do set old_version=%%i
    REM ## 输出看一眼
    REM echo old_version: %old_version%
    REM ## 更新
    mvn versions:update-properties -DincludeProperties={osc.commons.version} -Dproperties=[%new_versiont%] -DgenerateBackupPoms=%is_bak%

    REM ## 3. 更新 service 工程版本号
    mvn versions:set -DoldVersion=* -DnewVersion=%new_versiont% -DgenerateBackupPoms=%is_bak%

	REM ## 4. 返回根目录
    cd ../

    REM ## 结束
    echo [INFO] ----------------------------- end --------------------------------------
) else (
    REM ## 结束
    echo [INFO] -------------------------- 缺少参数 -------------------------------------
)

@echo off

mvn org.apache.maven.plugins:maven-help-plugin:3.2.0:evaluate -Dexpression=project.version -q -DforceStdout

.sh所要达到的效果与目的一致,所以就简单说明一下存在差异的地方:

有哪些差异:

  1. 语法上的差异
  2. 执行方式的差异,.bat批处理脚本执行命令:growth-version.bat 1.4.3 true

------------------- 2020.06.13 更新:归类脚本文件 -------------------

  1. .bat批处理脚本执行命令更改为:script\version\growth-version.bat 1.4.3 true

4. 验证


4.1 接口

  1. 下载v1.4.3标签的代码或者对照本篇博客更改v1.4.2标签的代码
  2. 如果是macOS系统,则还需要设置.sh脚本文件的可执行权限:chmod +x growth-version.sh
  3. 点击IDEA底部的Terminal终端入口
  4. 进入到项目根目录
  5. 根据不同系统,使用不同命令:./script/version/growth-version.sh 1.4.3 falsescript\version\growth-version.bat 1.4.3 false

5. 结语


果然“偷懒”是人类发展的第一生产力,为了省去每次去更改十几个文件,导致“奇怪的”知识点又增加了呢,巴适。


希望能够帮助到你

over




你可能感兴趣的:(初学者商城,SpringBoot,SpringCloud,Maven)