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