日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

基于Maven和SVN的項目版本管理

 yliu277 2019-08-26
流程demo.png

概述/背景

項目在開發(fā)過程中的版本,和在發(fā)布時的版本應(yīng)該有所區(qū)別。發(fā)布的版本應(yīng)該保證一個版本號對應(yīng)唯一的內(nèi)容。

之前遇到過一個項目,因為pom中的版本號沒有-SNAPSHOT,導(dǎo)致兩個環(huán)境依賴的項目雖然版本號相同,其實不是同一個。當(dāng)時得出結(jié)論:相同的版本號只應(yīng)該對應(yīng)一個內(nèi)容。

后來系統(tǒng)學(xué)習(xí)了下Maven,才具體了解到Maven體系中關(guān)于項目版本的標(biāo)準(zhǔn),這里分享出來,希望大家在維護(hù)項目版本的時候有據(jù)可依。

另外,Maven中的版本管理需要結(jié)合軟件版本控制工具使用,如Git、SVN等。雖然目前Git的使用已經(jīng)很普遍了,我的工作環(huán)境使用的是SVN,就以SVN為例進(jìn)行介紹。

Maven范圍的版本和SVN范圍的版本有不同的含義。前者面向的是項目,代碼多次修改,項目的版本號可以不變;后者面向的是代碼,每一次修改都是一個不同的版本。下文所說的版本一般是指項目的版本,特殊情況下會說明是代碼版本。

快照版本和發(fā)布版本

快照版本對應(yīng)開發(fā)過程中的版本,特點是快速的迭代更新,同樣的版本號對應(yīng)的是項目在一段時間內(nèi)的開發(fā)過程。

發(fā)布版本應(yīng)該是一個穩(wěn)定的版本,它應(yīng)該對應(yīng)項目在某個時刻的狀態(tài) —— 它對應(yīng)唯一的代碼版本。

快照版本和發(fā)布版本.png

快照版本使用-SNAPSHOT后綴。

在Maven體系中的區(qū)別

Maven解析依賴的一般機(jī)制是:先從本地倉庫找,找不到再從遠(yuǎn)程倉庫找。換言之,在本地倉庫找到了,就不會再去找遠(yuǎn)程倉庫。

如果有2個項目并行開發(fā),其中一個項目B依賴于另一個項目A。想象一下A和B都是持續(xù)更新的,項目B的開發(fā)人員如何確保能實時獲取項目A的最新內(nèi)容?

方案一:項目B的開發(fā)人員,每次構(gòu)建之前都手動從本地倉庫刪除項目A,這樣構(gòu)建的時候就會從遠(yuǎn)程倉庫下載最新的A。

方案二:項目B的開發(fā)人員,遷出項目A的代碼,自己將A項目安裝到本地倉庫。

這兩個個方案都不是Maven體系推薦的做法,方案二讓項目B的開發(fā)人員不得不去搭建項目A的開發(fā)環(huán)境,而且項目A如果出現(xiàn)代碼問題,項目B的開發(fā)人員可能就無能為力了。方案一增加了需要人工介入的工作量。

Maven使用SNAPSHOT來解決這個問題。如果項目依賴的是一個SNAPSHOT版本的依賴,Maven會定期從遠(yuǎn)程倉庫獲取最新的內(nèi)容,默認(rèn)頻率是一天一次。也可以使用-U參數(shù)來強(qiáng)制更新。

所以,項目A使用SNAPSHOT版本,項目B就可以定期或者實時獲取項目A的最新內(nèi)容。

反之,如果項目A沒有使用SNAPSHOT,項目B在第一次從遠(yuǎn)程倉庫下載項目A到本地倉庫之后,就一直使用本地倉庫的這個備份。即使項目A更新了,項目B也不會知道,除非人工刪除了項目A在本地倉庫的副本。

所以,開發(fā)過程中的版本,應(yīng)該使用SNAPSHOT版本。

發(fā)布版本的版本號約定

一般的情況下是下面這種結(jié)構(gòu):

<主版本>.<次版本>.<增量版本> 比如 1.1.2

各版本的作用如下:

  • 主版本
    項目的重大架構(gòu)變更
  • 次版本
    較大范圍的功能變化
  • 增量版本
    大量或緊急bug修復(fù)

這只是一個粗略的劃分,大家可以根據(jù)自己的情況討論每一個版本的使用場景。

通常主版本、次版本都會有,增量版本視情況而定。

更進(jìn)一步的情況,可以添加里程碑版本,版本的結(jié)構(gòu)如下:

<主版本>.<次版本>.<增量版本>—<里程碑版本>3.1.2-alpha-1

里程碑版本表示達(dá)成項目的某個里程碑,但通常不夠穩(wěn)定。大部分的公司應(yīng)該不會使用里程碑版本,在此略過不表。

版本維護(hù)流程

主干、標(biāo)簽和分支

  • 主干
    無需多說
  • 標(biāo)簽
    標(biāo)記某個有意義的代碼版本,每一個發(fā)布版本都應(yīng)該打一個標(biāo)簽。
  • 分支
    用于并行開發(fā),通常用于已有版本的bug修復(fù)。

流程demo

流程demo.png
  1. 在主干進(jìn)行1.0.0-SNAPSHOT的開發(fā),開發(fā)完成之后提交修改的代碼到主干。修改版本為1.0.0,再次提交,并添加標(biāo)簽。
  2. 隨后將版本改為1.1.0-SNAPSHOT,提交。然后開始新一輪的開發(fā),完成之后提交代碼,修改版本為1.1.0,再次提交并打標(biāo)簽。
  3. 接著將版本號改為1.2.0-SNAPSHOT,提交,并開始新一輪的開發(fā),在開發(fā)過程中1.1.0遇到一個緊急的bug,新建分支并1.1.1-SNAPSHOT,修改版本號為1.1.1-SNAPSHOT,提交并開始1.1.1-SNAPSHOT的開發(fā)。
  4. 1.1.1-SNAPSHOT開發(fā)完成,提交代碼。修改版本號至1.1.1,提交并打上標(biāo)簽。此時可以及時把1.1.1發(fā)布出去。同步分支到主干。
  5. 隨后,1.2.0-SNAPSHOT開發(fā)完成..

版本號的修改應(yīng)該作為一次單獨(dú)的提交。在發(fā)布的時候,項目版本號初始為SNAPSHOT版本,提交完所有的代碼之后,修改版本號為發(fā)布版本,再提交;這次提交只修改版本號。
在開始新一輪的開發(fā)過程時,修改版本號為新的SNAPSHOT,然后立即提交而不是修改代碼,版本號提交之后再開始開發(fā),這次提交只修改版本號。

SVN相關(guān)操作

SVN簡單介紹

SVN是一個很簡單的版本控制工具,你可以下載VisualSVN Server來搭建自己的SVN服務(wù)器。

SVNServer存儲結(jié)構(gòu).png

SVN的代碼主要是在倉庫里管理的,如上圖demo就是一個倉庫。完整的倉庫目錄結(jié)構(gòu)如下:

倉庫目錄(Repositories) |-- 倉庫1 |-- 項目1 |-- 主干(trunk) |-- 項目代碼 |-- 標(biāo)簽?zāi)夸洠╰ags) |-- 標(biāo)簽1 |-- 項目代碼 |-- 分支(branches) |-- 分支1 |-- 項目代碼

可以看到,SVN的每一個標(biāo)簽或者分支,都是一份完整的代碼副本。

與倉庫同一個級別的是用戶等其他,可以控制對倉庫的讀寫權(quán)限,具體沒有深入研究,大家有需要自己研究下。

SVN操作

這里介紹上文版本維護(hù)流程中涉及到的操作。這里以命令的方式介紹,使用客戶端界面的自己找一下操作的位置。

初始化項目

初始化項目首先要在VisulSVN Server的具體倉庫下新建一個項目結(jié)構(gòu):

倉庫-> 右鍵 -> 新建 –> Project Structure …

之后會生成一個標(biāo)準(zhǔn)的項目結(jié)構(gòu),包含了trunk、branches、tags,沒有代碼。

獲取trunk的url地址,通過trunk -> 右鍵 -> Copy URL…

在本地項目所在目錄,輸入以下命令:

svn import -m 'initial import' . https://PC-LIJINLONG9.hikvision.com:444/svn/demo/demo-version/trunk

添加標(biāo)簽

版本號修改為發(fā)布版本之后,應(yīng)該立即對當(dāng)前狀態(tài)添加一個標(biāo)簽:

svn copy https://PC-LIJINLONG9.hikvision.com:444/svn/demo/demo-version/trunk https://PC-LIJINLONG9.hikvision.com:444/svn/demo/demo-version/tags/1.0-RELEASE -m 'tag 1.0-RELEASE'

創(chuàng)建分支

svn copy https://PC-LIJINLONG9.hikvision.com:444/svn/demo/demo-version/tags/1.0-RELEASE https://PC-LIJINLONG9.hikvision.com:444/svn/demo/demo-version/branches/1.0.1-SNAPSHOT -m 'create branch 1.0.1-SNAPSHOT'

可以看到,添加標(biāo)簽和創(chuàng)建分支本質(zhì)上都是復(fù)制。

切換分支

svn switch https://PC-LIJINLONG9.hikvision.com:444/svn/demo/demo-version/branches/1.0.1-SNAPSHOT

合并分支

svn merge https://PC-LIJINLONG9.hikvision.com:444/svn/demo/demo-version/branches/1.0.1-SNAPSHOT

合并分支的時候,pom文件中的版本號會有沖突。一般選擇使用當(dāng)前的版本號。

Maven的release插件

在使用自動化的插件之前,建議先手動執(zhí)行上面的流程,熟悉版本維護(hù)的流程之后,再去使用自動化插件。

配置pom文件

pom文件需要添加scm配置和插件配置。scm是Software configuration management的縮寫。

project> ... scm> connection>scm:svn:https://PC-LIJINLONG9.hikvision.com:444/svn/demo/demo-version/trunkconnection> developerConnection>scm:svn:https://PC-LIJINLONG9.hikvision.com:444/svn/demo/demo-version/trunkdeveloperConnection> url>https://PC-LIJINLONG9.hikvision.com:444/svn/demo/demo-version/trunkurl> scm> build> plugins> plugin> groupId>org.apache.maven.pluginsgroupId> artifactId>maven-release-pluginartifactId> version>2.5.3version> configuration> tagBase>https://PC-LIJINLONG9.hikvision.com:444/svn/demo/demo-version/tagstagBase> branchBase>https://PC-LIJINLONG9.hikvision.com:444/svn/demo/demo-version/branchesbranchBase> configuration> plugin> plugins> build> project>

scm中配置了trunk的url,connection和developerConnection的值都以scm開頭,之后跟著版本控制工具的類型svn。除了svn之外,Maven還支持其他的工具,如git。

插件里配置了標(biāo)簽的url和分支的url,其實如果項目的結(jié)構(gòu)是標(biāo)準(zhǔn)的,trunk、tags和branches在同一級,可以不用配置這兩項。

配置完之后,就可以通過mvn命令來自動發(fā)布、打標(biāo)簽、創(chuàng)建分支了。

自動發(fā)布

插件把發(fā)布分為2步,第1步執(zhí)行上文中版本維護(hù)流程中介紹的發(fā)布流程,第2步使用mvn deploy部署構(gòu)建至倉庫。第1步由插件的prepare來完成,第2步由插件的perform目標(biāo)來完成。

如果prepare執(zhí)行失敗,可以通過rollback目標(biāo)來回滾,但是prepare生成的標(biāo)簽需要手動刪除。

release:prepare

prepare負(fù)責(zé)預(yù)發(fā)布,在prepare之前,需要確保所有的修改都已經(jīng)提交了,而當(dāng)前的pom文件中的版本號還沒有升級為發(fā)布版本號。

prepare所做的工作有:

  1. 檢查系統(tǒng)是否有未提交的代碼
  2. 詢問用戶發(fā)布版本號、標(biāo)簽和下一個開發(fā)版本號,并提供默認(rèn)值。
    What is the release version for 'demo-version'? (com.hikvision.demo:demo-version) 1.2: :
    What is SCM release tag or label for 'demo-version'? (com.hikvision.demo:demo-version) demo-version-1.2: :
    What is the new development version for 'demo-version'? (com.hikvision.demo:demo-version) 1.3-SNAPSHOT: :
    
  3. 修改pom-根據(jù)用戶的輸入,將快照版本升級為發(fā)布版本
  4. 修改pom-根據(jù)用戶的輸入,將scm中的地址改為標(biāo)簽對應(yīng)的地址
  5. 執(zhí)行Maven構(gòu)建
  6. 提交pom變更
  7. 根據(jù)用戶的輸入,新建標(biāo)簽
  8. 修改pom-根據(jù)用戶的輸入將version升級為新的快照版本,將scm信息更新。
  9. 提交pom變更。

上述的內(nèi)容,正是我們在升級項目版本需要做的事情。

使用命令:mvn release:prepare。

release:rollback

回退release:prepare的所執(zhí)行的操作,并提交。但是歷史記錄會保留,創(chuàng)建的標(biāo)簽頁不會刪除。

使用命令:mvn release:rollback。

release:perform

執(zhí)行版本發(fā)布。是基于發(fā)布版本標(biāo)簽地址所對應(yīng)的代碼進(jìn)行mvn deploy的結(jié)果。

使用命令:mvn release:perform

release:branch

自動創(chuàng)建分支。

使用命令:

mvn release:branch -DbranchName=1.1.1 -DupdateBranchVersions=true -DupdateWorkingCopyVersions=false

參考

  1. 《Maven實戰(zhàn)》 - 許曉斌

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多