1 引言?
??? 當(dāng)前的信息系統(tǒng)開(kāi)發(fā)過(guò)程存在著以下兩個(gè)急需解決的問(wèn)題。第一,開(kāi)發(fā)過(guò)程中代碼的持續(xù)集成問(wèn)題。過(guò)去的系統(tǒng)集成,開(kāi)發(fā)人員必須跑遍整個(gè)開(kāi)發(fā)中心,詢問(wèn)每一個(gè)程序員有沒(méi)有新的代碼,然后把這些新代碼拷貝過(guò)來(lái),再找到合適的插入位置,這樣集成方式效率低下,錯(cuò)誤率極高。第二,版本控制問(wèn)題。由團(tuán)隊(duì)進(jìn)行開(kāi)發(fā)的項(xiàng)目,尤其是開(kāi)源的項(xiàng)目,版本的控制是復(fù)雜的。開(kāi)發(fā)人員對(duì)于版本定義的不一致,以及先前版本的內(nèi)容不完整甚至是丟失都是危險(xiǎn)的。對(duì)于上述問(wèn)題最簡(jiǎn)單的解決方案就是:使用一套具有網(wǎng)絡(luò)功能并且?guī)в凶岄_(kāi)發(fā)者輕松獲取源代碼的配置管理系統(tǒng)作為所有代碼的來(lái)源,然后再使用一套版本管理工具,以做到安全正確地記錄和使用各個(gè)時(shí)期各個(gè)版本中的文件。?
??? CVS是一套出色的開(kāi)放源代碼的集配置管理與版本控制一體的工具,管理所有的源文件以及軟件的版本信息。這里的源文件不僅僅是代碼源文件,還包括創(chuàng)建的腳本文件、屬性文件、庫(kù)文件等。?
??? 正確地在系統(tǒng)開(kāi)發(fā)過(guò)程中,尤其是在企業(yè)級(jí)開(kāi)發(fā)或開(kāi)源開(kāi)發(fā)過(guò)程中使用CVS控制工具,體現(xiàn)了軟件配置管理與版本控制相結(jié)合的思想,這也是開(kāi)發(fā)人員和團(tuán)隊(duì)所必須具備的技能。?
2 CVS的概念?
??? CVS(Concurrent Versions System)是目前業(yè)界使用比較廣泛,思想比較先進(jìn),控制比較簡(jiǎn)單的配置管理與版本控制一體的工具。CVS是基于Unix體系中成熟的SCCS(Source Code Control System)和RCS(Revision Control System)開(kāi)發(fā)而成的一個(gè)開(kāi)放源碼的項(xiàng)目,已經(jīng)支持在Windows操作系統(tǒng)上的應(yīng)用。由于開(kāi)放源碼項(xiàng)目的開(kāi)發(fā)者分布很廣泛,對(duì)于源文件和版本信息的管理難度很大,需要一個(gè)結(jié)構(gòu)簡(jiǎn)單、功能強(qiáng)大、能夠跨平臺(tái)的工具進(jìn)行控制,所以開(kāi)放源碼項(xiàng)目配置管理與版本控制已經(jīng)成為目前CVS的一個(gè)典型應(yīng)用。
2.1 CVS的結(jié)構(gòu)?
??? CVS的基本工作思路就是在一臺(tái)服務(wù)器上建立一個(gè)倉(cāng)庫(kù),倉(cāng)庫(kù)里可以存放許多不同項(xiàng)目的源程序,由倉(cāng)庫(kù)管理員統(tǒng)一管理這些源程序。這樣就好象只有一個(gè)人在修改文件一樣避免了沖突。每個(gè)用戶在使用倉(cāng)庫(kù)之前,首先要把倉(cāng)庫(kù)里的項(xiàng)目文件下載到本地。用戶做的任何修改都是在本地進(jìn)行的,然后用CVS 命令進(jìn)行提交,再由 CVS 倉(cāng)庫(kù)管理員統(tǒng)一修改。這樣就可以做到跟蹤文件的變化,控制代碼的沖突?;谝陨系墓ぷ魉悸稢VS采用客戶機(jī)/服務(wù)器的結(jié)構(gòu),軟件的源文件以及各種版本信息存儲(chǔ)在作為倉(cāng)庫(kù)的中心服務(wù)器內(nèi),開(kāi)發(fā)者可以隨時(shí)通過(guò)CVS的客戶端工具將本地源文件的副本與中心服務(wù)器倉(cāng)庫(kù)中的源文件保持一致。CVS的結(jié)構(gòu)如圖一所示。?
圖一:CVS結(jié)構(gòu)圖
2.2 CVS的重要術(shù)語(yǔ)?
2.2.1 Module(模塊):相互關(guān)聯(lián)的一組文件的集合,一般一個(gè)Module會(huì)和一個(gè)工程相對(duì)應(yīng)。2.2.2 Respository(倉(cāng)庫(kù)):存放Module的倉(cāng)庫(kù),可以在開(kāi)發(fā)人員的本地也可以在遠(yuǎn)程CVS服務(wù)器上。
2.2.3 Branch(分枝):Branch是倉(cāng)庫(kù)中獨(dú)立派生的一個(gè)分離的開(kāi)發(fā)版本,用于管理源文件的修改。其中HEAD作為一個(gè)特殊的Branch代表主干版本。HEAD可以分離出不同的Branch,而每個(gè)Branch中的變更又可以很容易地與HEAD進(jìn)行合并。這種Branch模型通過(guò)支持源文件的并發(fā)修改,保證了不同開(kāi)發(fā)者的相對(duì)獨(dú)立,但又高度集成。
2.2.4 Merge(合并):在CVS版本控制過(guò)程中,Merge作為一個(gè)核心的工作,將派生的Branch版本與HEAD的最新版本之間的變更合并到開(kāi)發(fā)人員的工作目錄之中。CVS提供的Merge命令使開(kāi)發(fā)人員在使用源文件時(shí)不會(huì)鎖定該文件,即同一個(gè)CVS管理的源文件可以被多個(gè)開(kāi)發(fā)人員同時(shí)進(jìn)行修改。
圖二:Java開(kāi)發(fā)過(guò)程中CVS控制的示意圖
2.3 CVS的工作流程?
??? CVS的工作流程包括以下三個(gè)步驟。
??? 第一,預(yù)處理。通過(guò)更新操作保證所有本地源文件與最新的Branch中的源文件一致性。
??? 第二,代碼開(kāi)發(fā)。在本地進(jìn)行軟件代碼的開(kāi)發(fā),并在本地保存代碼的修改。
??? 第三,同步。當(dāng)做好提交工作的準(zhǔn)備后,進(jìn)行與服務(wù)器的同步操作。Incoming和Outgoing是CVS工作時(shí)的兩種狀態(tài)模式,在進(jìn)行Update操作時(shí)(從服務(wù)器得到其他人的修改),CVS進(jìn)入Incoming狀態(tài);在進(jìn)行Commit操作時(shí)(把本地修改提交給CVS服務(wù)器),CVS進(jìn)入Outgoing狀態(tài)。在同步階段中,開(kāi)發(fā)人員首先通過(guò)Update操作檢查本地修改是否會(huì)造成與服務(wù)器端源文件的沖突和對(duì)完整性的破壞,最后向服務(wù)器Commit本地的修改。CVS版本控制的基本流程如圖三所示:
3 Java程序開(kāi)發(fā)過(guò)程中的CVS控制?
??? Java語(yǔ)言具有語(yǔ)法簡(jiǎn)單、安全、支持多線程、具有跨平臺(tái)性以及純面向?qū)ο蟮忍攸c(diǎn)。為了廣泛適應(yīng)各種類(lèi)型的應(yīng)用模式,先后出現(xiàn)了J2SE、J2ME以及J2EE等組件技術(shù)。
??? 現(xiàn)在CVS版本控制器對(duì)于Java提供了無(wú)縫的支持。眾多Java開(kāi)發(fā)工具都將CVS功能內(nèi)嵌到自身中,作為其版本控制的基本依托。主要支持CVS的開(kāi)發(fā)工具有Borland公司的JBuilder和Eclipse組織提供的開(kāi)源工具Eclipse。其中,JBuilder代表了當(dāng)前主流的商用Java開(kāi)發(fā)工具,Eclipse則代表了典型的開(kāi)源Java開(kāi)發(fā)工具。二者在最新的版本中都已經(jīng)利用自身嵌入的CVS控制器實(shí)現(xiàn)了在本地或遠(yuǎn)程CVS服務(wù)器上的軟件版本控制,從而將先進(jìn)的版本控制思想引入到Java世界中。此外,對(duì)于其它尚未嵌入CVS的Java開(kāi)發(fā)工具,開(kāi)發(fā)人員還可以下載得到獨(dú)立的CVS管理器。比較常用的CVS管理器有WinCVS。三種不同的CVS管理器各有特點(diǎn),下面分別介紹。
3.1 JBuilder中的CVS控制?
??? JBuilder是Borland公司的Java程序開(kāi)發(fā)的主要工具,更是J2EE組件技術(shù)開(kāi)發(fā)中的重要商業(yè)工具。JBuilder的標(biāo)準(zhǔn)版和企業(yè)版中集成了CVS版本控制系統(tǒng)功能,在JBuilder的應(yīng)用瀏覽器中使用CVS的接口可以方便地訪問(wèn)到CVS提供的大部分命令,從而直接訪問(wèn)、使用和控制本地或遠(yuǎn)程的CVS系統(tǒng)。
??? JBuilder中使用CVS的主要過(guò)程如下:第一,創(chuàng)建CVS倉(cāng)庫(kù)(Respository)。該倉(cāng)庫(kù)可以位于本地或遠(yuǎn)程服務(wù)器;第二,創(chuàng)建CVS 模塊(Module)。開(kāi)發(fā)人員在指定的倉(cāng)庫(kù)中創(chuàng)建模塊,一旦工程以模塊的形成存在,那么工程的內(nèi)容就都在CVS的控制之下了;第三,將JBuilder開(kāi)發(fā)的源文件添加到CVS倉(cāng)庫(kù)中;第四,從CVS倉(cāng)庫(kù)中檢出(check out)模塊內(nèi)容存放到本地工程中;第五,在檢出的本地工程中修改或刪除源文件;第六,解決與服務(wù)器倉(cāng)庫(kù)中的代碼沖突,最終將本地源文件的更新內(nèi)容提交到CVS倉(cāng)庫(kù)中。
3.2 Eclipse中的CVS?
??? Eclipse是開(kāi)源組織的Java開(kāi)發(fā)工具,可以方便高效地開(kāi)發(fā)J2SE和J2EE等組件技術(shù)下的信息系統(tǒng)或插件。Eclipse本身內(nèi)置了CVS命令,不需要使用其他客戶端軟件,可以直接訪問(wèn)、使用和控制CVS的服務(wù)器。
??? 作為開(kāi)源項(xiàng)目主要使用的開(kāi)發(fā)工具, Eclipse與以JBuilder為代表的商業(yè)開(kāi)發(fā)工具在CVS使用上模式上有很大差別,即Eclipse沒(méi)有在本地創(chuàng)建CVS服務(wù)進(jìn)行控制管理的功能。其原因在于使用Eclipse開(kāi)發(fā)的開(kāi)源項(xiàng)目,項(xiàng)目中的源文件需要高度地集中管理。開(kāi)發(fā)者需要將本地的源文件提交到遠(yuǎn)程服務(wù)器上,由開(kāi)源組織統(tǒng)一進(jìn)行控制。而JBuilder作為商用工具考慮到應(yīng)用開(kāi)發(fā)者面對(duì)的信息系統(tǒng)的類(lèi)型很廣泛,對(duì)于開(kāi)發(fā)規(guī)模較小的應(yīng)用,源文件的控制不需要放置在CVS的遠(yuǎn)程服務(wù)器上,可以通過(guò)在本地創(chuàng)建CVS服務(wù)的方式進(jìn)行獨(dú)立控制。
3.3 通過(guò)WinCVS控制Java程序?
??? WinCVS是Windows操作系統(tǒng)下的一種CVS客戶端控制軟件,是目前對(duì)于CVS控制最為完善與靈活的軟件,其使用方法相對(duì)比較復(fù)雜。WinCVS獨(dú)立于任何開(kāi)發(fā)工具,因此可以控制多種開(kāi)發(fā)語(yǔ)言的源文件(如:Java、C/C++、Pascal)。例如,對(duì)于使用其他Java開(kāi)發(fā)工具(如:Jdesigner、TextPad等等)甚至是寫(xiě)字板開(kāi)發(fā)的Java程序源文件,WinCVS都能夠進(jìn)行控制管理。
??? 使用WinCVS的過(guò)程如下:第一,配置客戶端與服務(wù)器的參數(shù);第二,CVS管理人員將源文件導(dǎo)入到服務(wù)器的模塊中;第三,CVS管理人員創(chuàng)建標(biāo)簽、分支;第四,開(kāi)發(fā)人員登錄遠(yuǎn)程CVS服務(wù)器;第五,開(kāi)發(fā)人員從服務(wù)器倉(cāng)庫(kù)中檢出(checkout)模塊到本地工程(如圖四所示);第六,開(kāi)發(fā)人員將本地工程修改過(guò)的文件提交到服務(wù)器的倉(cāng)庫(kù)中;第七,開(kāi)發(fā)人員在每次對(duì)本地的文件修改前,將服務(wù)器端倉(cāng)庫(kù)中存放的文件更新到本地工程中,以保證在多人操作同一個(gè)文件時(shí)不會(huì)引起沖突;第八,開(kāi)發(fā)人員將本地工程中的修改結(jié)果提交到服務(wù)器倉(cāng)庫(kù)中;第九,CVS的管理人員合并不同分支(版本)的文件。在整個(gè)過(guò)程中,管理人員和開(kāi)發(fā)人員可以隨時(shí)察看查看文件的當(dāng)前狀態(tài)和歷史信息。
????????????
圖四:Checkout操作
4 結(jié)束語(yǔ)?
??? 利用CVS工具結(jié)合配置管理和版本控制的先進(jìn)思想管理Java程序開(kāi)發(fā)全過(guò)程,其目的是建立一整套高效安全的Java軟件項(xiàng)目開(kāi)發(fā)的控制流程,以到達(dá)軟件工程中對(duì)于軟件開(kāi)發(fā)實(shí)現(xiàn)過(guò)程的要求。
??? CVS工具的作用是提供快捷的方法和清晰的控制流程給開(kāi)發(fā)人員。開(kāi)發(fā)人員則需要在理解先進(jìn)的配置管理和版本控制思想的前提下,使用CVS工具結(jié)合Java開(kāi)發(fā)工具做到真正的高效管理。總之,在現(xiàn)代的項(xiàng)目開(kāi)發(fā)過(guò)程中,CVS已經(jīng)成為解決代碼持續(xù)集成與版本控制的有效工具。