![]() 流程demo.png
概述/背景項目在開發(fā)過程中的版本,和在發(fā)布時的版本應(yīng)該有所區(qū)別。發(fā)布的版本應(yīng)該保證一個版本號對應(yīng)唯一的內(nèi)容。 之前遇到過一個項目,因為pom中的版本號沒有 后來系統(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
快照版本使用 在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使用 所以,項目A使用SNAPSHOT版本,項目B就可以定期或者實時獲取項目A的最新內(nèi)容。 反之,如果項目A沒有使用 所以,開發(fā)過程中的版本,應(yīng)該使用 發(fā)布版本的版本號約定一般的情況下是下面這種結(jié)構(gòu): <主版本>.<次版本>.<增量版本>增量版本>次版本>主版本> 比如 1.1.2 各版本的作用如下:
這只是一個粗略的劃分,大家可以根據(jù)自己的情況討論每一個版本的使用場景。 通常主版本、次版本都會有,增量版本視情況而定。 更進(jìn)一步的情況,可以添加里程碑版本,版本的結(jié)構(gòu)如下: <主版本>.<次版本>.<增量版本>—<里程碑版本>里程碑版本>增量版本>次版本>主版本> 如 3.1.2-alpha-1 里程碑版本表示達(dá)成項目的某個里程碑,但通常不夠穩(wěn)定。大部分的公司應(yīng)該不會使用里程碑版本,在此略過不表。 版本維護(hù)流程主干、標(biāo)簽和分支
流程demo![]() 流程demo.png
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):
之后會生成一個標(biāo)準(zhǔn)的項目結(jié)構(gòu),包含了trunk、branches、tags,沒有代碼。 獲取trunk的url地址,通過 在本地項目所在目錄,輸入以下命令:
添加標(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)建分支
可以看到,添加標(biāo)簽和創(chuàng)建分支本質(zhì)上都是復(fù)制。 切換分支svn switch 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步使用 如果 release:prepareprepare負(fù)責(zé)預(yù)發(fā)布,在prepare之前,需要確保所有的修改都已經(jīng)提交了,而當(dāng)前的pom文件中的版本號還沒有升級為發(fā)布版本號。 prepare所做的工作有:
上述的內(nèi)容,正是我們在升級項目版本需要做的事情。 使用命令: release:rollback回退 使用命令: release:perform執(zhí)行版本發(fā)布。是基于發(fā)布版本標(biāo)簽地址所對應(yīng)的代碼進(jìn)行mvn deploy的結(jié)果。 使用命令: release:branch自動創(chuàng)建分支。 使用命令: mvn release:branch -DbranchName=1.1.1 -DupdateBranchVersions=true -DupdateWorkingCopyVersions=false
參考
|
|