「初學者商城」- 接口 - 一鍵升級版本號(優化)

1. 前言


目前每次更新,都需要在每一個工程的pom文件中更改版本號,有時候很容易漏改;而且這一改就是十幾個地方,等後期模塊變得越來越多,如果還是一個個改就真的有點上頭了…所以版本號升級的優化方案就這麼來了。


2. 源碼


完整項目地址:https://github.com/intomylife/osc-front

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

v1.4.3 下載地址:ziptar.gz

注:對於標籤的說明「初學者商城」- 寫在最前面 #5.1


3. 接口

3.1 查看更改內容

  1. 統一配置版本號
  2. 各自配置版本號
  3. 使用腳本更新版本號

3.2 統一配置版本號

開始想着把版本號全部放在聚合服務工程中統一配置

  • 預期效果: 版本號都配置在一個文件中,容易維護,不會漏改
  • 實際結果: osc-service中能打包成功,但是base-service-core打包會失敗,報錯找不到${xxx.xxx},也就是可以打包父工程,無法打包子工程
  • 其他問題: 在子工程中的<parent>標籤引入${}時 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}

    ## 結束
    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

核心命令:

  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}:執行此命令會自動更新指定節點的屬性值。首先這裏更新目標是<properties></properties>節點中的屬性,然後會把值更新爲多少,取的是第一個入參${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 ('..\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 ('..\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 ## 結束
    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

4. 驗證


4.1 接口

  1. 下載v1.4.3標籤的代碼或者對照本篇博客更改v1.4.2標籤的代碼
  2. 如果是macOS系統,則還需要設置.sh腳本文件的可執行權限:chmod +x growth-version.sh
  3. 點擊IDEA底部的Terminal終端入口
  4. 進入到項目根目錄
  5. 根據不同系統,使用不同命令:./growth-version.sh 1.4.3 falsegrowth-version.bat 1.4.3 false

5. 結語


果然“偷懶”是人類發展的第一生產力,爲了省去每次去更改十幾個文件,導致“奇怪的”知識點又增加了呢,巴適。


希望能夠幫助到你

over




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章