轉(zhuǎn)載:http://www-900.ibm.com/developerWorks/cn/linux/opensource/os-ecshare/index.shtml
本文概述了 Eclipse 平臺(tái)如何支持軟件項(xiàng)目中的源代碼版本控制。首先,我們將簡(jiǎn)要討論一下團(tuán)隊(duì)代碼開(kāi)發(fā)的思想,然后研究 Eclipse 如何使用 CVS 代碼資源庫(kù)。我們還將研究一些源代碼管理軟件工具,可以通過(guò) Eclipse 插件擴(kuò)展來(lái)支持這些工具。
在團(tuán)隊(duì)項(xiàng)目中共享源代碼
現(xiàn)今的大多數(shù)應(yīng)用程序是由多人組成的團(tuán)隊(duì)開(kāi)發(fā)的。即使只涉及幾個(gè)開(kāi)發(fā)人員的小項(xiàng)目,也需要對(duì)源代碼的更改進(jìn)行嚴(yán)格控制。這就是源代碼管理軟件的任務(wù)。源代碼版本控制軟件必須支持兩個(gè)核心功能:
- 提供一種方法,能夠協(xié)調(diào)對(duì)源代碼的更改,并能集成這些更改
- 團(tuán)隊(duì)所提交工作的歷史記錄
當(dāng)團(tuán)隊(duì)成員完成新的工作時(shí),通過(guò)將這些更改提交到資源庫(kù)來(lái)共享他們的工作。類(lèi)似地,當(dāng)他們希望獲得最新可用的工作成果時(shí),就可以根據(jù)資源庫(kù)中的更改,更新自己的本地工作空間。這意味著項(xiàng)目資源庫(kù)會(huì)因團(tuán)隊(duì)成員提交新工作成果而經(jīng)常發(fā)生更改。換句話(huà)說(shuō),資源庫(kù)應(yīng)該表示項(xiàng)目的當(dāng)前狀態(tài)。任何時(shí)候,團(tuán)隊(duì)成員都要能夠根據(jù)資源庫(kù)更新自己的工作空間,并確信它們是最新的。
維護(hù)歷史記錄也很重要,那樣就可以將當(dāng)前工作與先前版本進(jìn)行比較,如有必要,還可以回復(fù)到先前版本。協(xié)調(diào)團(tuán)隊(duì)的工作,以便只存在唯一的當(dāng)前項(xiàng)目狀態(tài)定義,以及包含團(tuán)隊(duì)已集成的工作,這些對(duì)于管理版本控制也是十分必要的。這種協(xié)調(diào)有可能是最難實(shí)現(xiàn)的目標(biāo)。
最理想的模型是:團(tuán)隊(duì)的任何成員都可以對(duì)自己有權(quán)訪(fǎng)問(wèn)的任何資源進(jìn)行更改。因?yàn)閮蓚€(gè)團(tuán)隊(duì)成員可以提交對(duì)同一資源的更改,所以有可能發(fā)生沖突,必須解決這種沖突。這種模型假定沖突具有唯一性。但遺憾的是,沒(méi)有任何源代碼是孤立地存在的;通常它包含與其它資源隱式或顯式的相關(guān)性。源代碼引用了在其它源代碼資源中描述的構(gòu)件。但源代碼管理軟件的工作就到此為止了,因?yàn)樗⒉荒苋〈?xiàng)目管理。項(xiàng)目管理者必須履行其職責(zé):協(xié)調(diào)其它成員的工作以及負(fù)責(zé)進(jìn)度、項(xiàng)目階段和發(fā)布日期。此外,源代碼管理也不能替代開(kāi)發(fā)人員之間的交流。
Eclipse 平臺(tái)如何支持代碼管理
Eclipse 平臺(tái)提供了作為團(tuán)隊(duì)在軟件項(xiàng)目中共享代碼和工作的能力。Eclipse 廣泛地支持各種代碼管理解決方案,這要?dú)w功于它的插件體系結(jié)構(gòu)(不過(guò),現(xiàn)已推出了對(duì) CVS 的支持)。Eclipse 平臺(tái)體系結(jié)構(gòu)的重點(diǎn)在于工作空間。工作空間維護(hù)構(gòu)建和測(cè)試軟件項(xiàng)目所需的一切。它包含對(duì)象(源代碼和資源)。它還保存了用于項(xiàng)目、IDE 和插件的配置設(shè)置。工作空間是在開(kāi)發(fā)人員的機(jī)器上本地進(jìn)行維護(hù)的,而團(tuán)隊(duì)通過(guò)外部資源庫(kù)進(jìn)行協(xié)作,不同開(kāi)發(fā)人員的代碼在資源庫(kù)進(jìn)行匯集。可以經(jīng)由因特網(wǎng)通過(guò)“客戶(hù)機(jī)-服務(wù)器”體系結(jié)構(gòu)訪(fǎng)問(wèn)資源庫(kù)。
Eclipse 平臺(tái)提供了對(duì)于直接從工作空間進(jìn)行團(tuán)隊(duì)開(kāi)發(fā)操作的支持。這種支持允許開(kāi)發(fā)人員并發(fā)地與幾個(gè)獨(dú)立的資源庫(kù)以及不同版本的代碼或項(xiàng)目進(jìn)行交互。工作空間中的資源允許團(tuán)隊(duì)支持組件處理版本和配置管理問(wèn)題。當(dāng)然,單個(gè)工作空間可以同時(shí)訪(fǎng)問(wèn)不同類(lèi)型的資源庫(kù)。Eclipse 平臺(tái)并沒(méi)有提供它自己的代碼管理解決方案;它總是依靠外部系統(tǒng)。Eclipse 平臺(tái)只對(duì)一個(gè)(但也是最流行的一個(gè))源代碼管理系統(tǒng)提供內(nèi)置支持:并發(fā)版本控制系統(tǒng)(Concurrent Versions System,CVS)。對(duì)第三方代碼管理應(yīng)用程序的支持一節(jié)中描述了使用第三方插件支持其它資源庫(kù)。
CVS 是什么?
CVS 誕生于 1986 年,當(dāng)時(shí)作為一組 shell 腳本而出現(xiàn),但它現(xiàn)在已經(jīng)發(fā)展成了最流行的針對(duì)軟件開(kāi)發(fā)人員的源代碼版本管理解決方案。CVS 是用于代碼版本管理的開(kāi)放源碼的客戶(hù)機(jī)/服務(wù)器解決方案,它可用于各種平臺(tái),包括 Linux 和 Windows NT/2000/XP。請(qǐng)參閱本文末尾的參考資料,其中有 CVS 客戶(hù)機(jī)、服務(wù)器和源代碼的下載鏈接。
通常,CVS 的主要功能是記錄源文件的歷史。當(dāng)一組開(kāi)發(fā)人員從事同一個(gè)項(xiàng)目時(shí),CVS 將他們彼此隔離開(kāi)來(lái)。每個(gè)開(kāi)發(fā)人員都在他/她自己的目錄中獨(dú)立工作,然后使用 CVS 資源庫(kù)(不時(shí)地)合并工作結(jié)果。
Eclipse 擁有與 Eclipse 平臺(tái) IDE 緊密集成的內(nèi)置 CVS 客戶(hù)機(jī),它是作為一個(gè)單獨(dú)透視圖(CVS Repository Exploring 透視圖)而實(shí)現(xiàn)的,用于與 CVS 的交互。用于 CVS 的通用 Eclipse 設(shè)置(General Eclipse settings for CVS)位于 Window -> Preferences window -> Team 下。在切換到 CVS Repository Exploring 透視圖之后,就可以使用所有 CVS 操作了(轉(zhuǎn)至 Window -> Open Perspective -> Other -> CVS Repository Exploring 菜單 — 請(qǐng)參閱圖 1 和圖 2)。
圖 1. 切換到 CVS Repository Exploring 透視圖
首先設(shè)置資源庫(kù)的位置,它將定義用于選定 CVS 服務(wù)器/資源庫(kù)的連接參數(shù)。請(qǐng)確保使用 SSH 隧道(extssh
)。
圖 2. 瀏覽 CVS Repository Exploring 透視圖中的 CVS 資源庫(kù)
Eclipse/CVS 的源代碼工作流
在 CVS 團(tuán)隊(duì)協(xié)作模型中,團(tuán)隊(duì)成員彼此獨(dú)立地在他們各自的工作臺(tái)上完成自己的所有工作。最后,他們希望共享其工作。他們通過(guò) CVS 資源庫(kù)實(shí)現(xiàn)這一點(diǎn)。CVS 使用分支(branch)模型來(lái)支持彼此獨(dú)立而又高度相互依賴(lài)的多個(gè)工作流程(course of work)。這些分支是開(kāi)發(fā)團(tuán)隊(duì)用來(lái)共享和集成正在進(jìn)行中的工作的地方。可以認(rèn)為分支是一個(gè)共享的工作臺(tái),當(dāng)團(tuán)隊(duì)成員對(duì)源代碼進(jìn)行更改時(shí)就更新這個(gè)工作臺(tái)。這個(gè)模型允許從事 CVS 團(tuán)隊(duì)項(xiàng)目的每個(gè)開(kāi)發(fā)人員在進(jìn)行更改時(shí)與其他成員共享其工作,以及在項(xiàng)目進(jìn)展期間訪(fǎng)問(wèn)其他成員的工作。
一個(gè)稱(chēng)為 HEAD 的特殊分支用來(lái)表示資源庫(kù)中的主要工作流程(HEAD 通常被稱(chēng)為主干)。當(dāng)團(tuán)隊(duì)成員將資源提交給該分支時(shí),會(huì)影響這些相關(guān)性。確保相關(guān)性的完整性是很重要的,因?yàn)樵摲种П硎玖水?dāng)前項(xiàng)目的狀態(tài)。當(dāng)然,任何時(shí)候,團(tuán)隊(duì)成員都可以使用該分支的內(nèi)容作為新工作的基礎(chǔ)。
那些規(guī)則不僅適用于 CVS:無(wú)論使用哪種版本控制軟件,團(tuán)隊(duì)項(xiàng)目中都有一些用于源代碼管理的常見(jiàn)步驟。下面是一個(gè)使用 Eclipse 內(nèi)置的 CVS 支持的示例工作流:
1. 啟動(dòng)新的團(tuán)隊(duì)項(xiàng)目
每個(gè)新的空 Eclipse 項(xiàng)目都可以通過(guò) CVS(或受支持的任何其它源代碼管理系統(tǒng))進(jìn)行共享。開(kāi)發(fā)人員也可以通過(guò)將其現(xiàn)有的代碼遷移到資源庫(kù)來(lái)共享它。要進(jìn)行共享,單擊項(xiàng)目主文件夾,在顯示的上下文菜單中使用 Team -> Share Project 選項(xiàng),如圖 3 所示。
圖 3. 使用 CVS 資源庫(kù)共享本地項(xiàng)目
另一個(gè)選項(xiàng)是通過(guò)從選定的 CVS 資源庫(kù)分支導(dǎo)入代碼來(lái)創(chuàng)建新的工作臺(tái)項(xiàng)目。只要選擇適當(dāng)分支(或 HEAD),然后選擇從 CVS Repository Exploring 透視圖中的上下文菜單中選擇“Checkout As Project”選項(xiàng),如圖 4 所示。
圖 4. 從現(xiàn)有的 CVS 資源庫(kù)創(chuàng)建新項(xiàng)目
2. 使用代碼并進(jìn)行更改
開(kāi)發(fā)人員通過(guò) Eclipse 工作臺(tái)在本地使用代碼,包括的工作有創(chuàng)建新資源、修改現(xiàn)有資源、編寫(xiě)注釋?zhuān)⒃谒麄兪褂煤笤诒镜乇4孢@些內(nèi)容。
3. 使本地更改與 CVS 資源庫(kù)同步
如果一個(gè)項(xiàng)目開(kāi)發(fā)人員準(zhǔn)備提交他/她的工作,那么首先要執(zhí)行更新操作。這會(huì)針對(duì)引入的更改核對(duì)資源庫(kù),并將這些更改添加到該開(kāi)發(fā)人員的本地工作臺(tái)。這樣確保了開(kāi)發(fā)人員知道這些更改可能會(huì)影響他/她將要提交的工作的完整性。使用項(xiàng)目上下文菜單中的 Compare With... 選項(xiàng)將本地版本與資源庫(kù)中存儲(chǔ)的代碼進(jìn)行比較(請(qǐng)參閱圖 5)。
3. 使本地更改與 CVS 資源庫(kù)同步
如果一個(gè)項(xiàng)目開(kāi)發(fā)人員準(zhǔn)備提交他/她的工作,那么首先要執(zhí)行更新操作。這會(huì)針對(duì)引入的更改核對(duì)資源庫(kù),并將這些更改添加到該開(kāi)發(fā)人員的本地工作臺(tái)。這樣確保了開(kāi)發(fā)人員知道這些更改可能會(huì)影響他/她將要提交的工作的完整性。使用項(xiàng)目上下文菜單中的 Compare With... 選項(xiàng)將本地版本與資源庫(kù)中存儲(chǔ)的代碼進(jìn)行比較(請(qǐng)參閱圖 5)。
下一步是解決最后出現(xiàn)的任何沖突,并設(shè)法再次編譯代碼。如果一切正常,那么從項(xiàng)目上下文菜單使用 Team -> Commit... 選項(xiàng)執(zhí)行提交操作,如圖 6 所示。這會(huì)使所有更改都集成到資源庫(kù)中。
4. 管理資源庫(kù)
CVS 允許開(kāi)發(fā)人員將更改隔離在開(kāi)發(fā)的某些獨(dú)立路徑之內(nèi),這些路徑稱(chēng)為分支。當(dāng)一個(gè)開(kāi)發(fā)人員更改某個(gè)分支上的文件時(shí),這種更改不會(huì)出現(xiàn)在主干或其它分支上。那些分支被命名為子版本(subversion)或代碼分叉(code fork)。稍后,由合并操作將更改從一個(gè)分支遷移到另一個(gè)分支(或主干)。然后提交這些修訂。這樣就有效地將更改復(fù)制到了另一個(gè)分支上。使用項(xiàng)目上下文菜單的 Team -> Branch... 選項(xiàng),Eclipse 使開(kāi)發(fā)分支之間的遷移變得容易。
當(dāng)然,當(dāng)開(kāi)發(fā)團(tuán)隊(duì)維護(hù)大型資源庫(kù)時(shí),有必要控制項(xiàng)目?jī)?nèi)的提交和合并操作。Eclipse/CVS 集成提供了一種特殊的視圖:CVS Repository History(請(qǐng)參閱圖 7)。它給出了關(guān)于團(tuán)隊(duì)成員在資源庫(kù)中所執(zhí)行更改的快速預(yù)覽。
圖 7. 在 CVS Resource History 窗口中查看帶注釋的修訂歷史記錄
Eclipse 平臺(tái)提供了幾個(gè)支持代碼管理的實(shí)用程序。最有用的是補(bǔ)丁功能。它將出自?xún)蓚€(gè)來(lái)源(譬如本地工作臺(tái)和資源庫(kù))的代碼進(jìn)行比較,然后創(chuàng)建一個(gè)包含代碼差異的類(lèi)似 UNIX 的補(bǔ)丁文件(請(qǐng)參閱圖 8)。可以將該文件發(fā)送給開(kāi)發(fā)人員以將源代碼升級(jí)到最新版本。
圖 8. 創(chuàng)建用于源代碼分發(fā)的補(bǔ)丁
5. 斷開(kāi)項(xiàng)目與 CVS 的連接
當(dāng)項(xiàng)目開(kāi)發(fā)已經(jīng)結(jié)束,并且團(tuán)隊(duì)希望凍結(jié)源代碼時(shí),可以從 HEAD 資源庫(kù)刪除該項(xiàng)目的最終版本。斷開(kāi)項(xiàng)目與 CVS 的連接將在該項(xiàng)目及其資源上禁用資源庫(kù)操作,并刪除與該項(xiàng)目相關(guān)聯(lián)的 CVS 信息(這一操作是可選的)。
可以通過(guò)項(xiàng)目上下文菜單中的 Team -> Disconnect 選項(xiàng)執(zhí)行斷開(kāi)連接操作。通過(guò)選擇這個(gè)選項(xiàng),會(huì)打開(kāi) Confirm Disconnect from CVS 對(duì)話(huà)框。在將該項(xiàng)目與資源庫(kù)的連接斷開(kāi)之后,該團(tuán)隊(duì)必須確定如何處理 CVS 信息。第一個(gè)選項(xiàng)是“Delete the CVS meta information”;它將禁用 CVS 團(tuán)隊(duì)菜單操作并從文件系統(tǒng)中刪除 CVS 文件夾及其內(nèi)容。第二個(gè)選項(xiàng)是“Do not delete the CVS meta information”;它將禁用 CVS 團(tuán)隊(duì)菜單操作,但保留 CVS 元信息。
對(duì)第三方代碼管理應(yīng)用程序的支持
CVS 有幾個(gè)重要的限制:它不能確定單個(gè)文件或整個(gè)文件集范圍內(nèi)同時(shí)進(jìn)行的更改,它也不能檢測(cè)文件之間的邏輯沖突。其沖突概念純粹是文本意義上的,當(dāng)對(duì)于同一基本文件的兩個(gè)更改時(shí)間上非常非常接近,從而使合并命令受到干擾時(shí),就會(huì)發(fā)生沖突。CVS 也不能提供任何類(lèi)似于消息傳遞這樣的交互式協(xié)作工具。幸運(yùn)的是,CVS 并不是 Eclipse 平臺(tái)所支持的唯一的源代碼管理軟件。開(kāi)發(fā)人員可以通過(guò)插件擴(kuò)展 Eclipse 平臺(tái)的功能,而且目前(到 2003 年 3 月 4 日為止)已有 16 個(gè)可用于團(tuán)隊(duì)開(kāi)發(fā)軟件的插件。所有插件都是由 Eclipse 社區(qū)或商業(yè)軟件供應(yīng)商創(chuàng)建的。這些插件中的大多數(shù)添加了對(duì)第三方、商業(yè)源代碼管理系統(tǒng)的支持。最有價(jià)值的插件是那些支持流行的企業(yè)代碼管理系統(tǒng)(如 Merant PVCS 和 Rational ClearCase)的插件。例如,CVS-SSH2 插件允許通過(guò) SSH2 會(huì)話(huà)訪(fǎng)問(wèn) CVS,而 Microsoft Visual SourceSafe(VSS)團(tuán)隊(duì)提供程序插件添加了對(duì) MS VSS 產(chǎn)品的支持(也可以在諸如 Linux 這樣的非 Windows 平臺(tái)上使用)。
但是,我本人所偏愛(ài)的插件是 Koi(請(qǐng)參閱參考資料以獲取鏈接)。盡管它并非嚴(yán)格用于源代碼控制,但這個(gè)創(chuàng)新的工具給協(xié)作開(kāi)發(fā)注入了許多新的活力。其當(dāng)前版本支持工作臺(tái)到工作臺(tái)的消息傳遞、共享標(biāo)記、沖突更改通知、共享日歷和事件通知。Koi 將 XML-RPC 用作其客戶(hù)機(jī)-服務(wù)器體系結(jié)構(gòu)中的通信模型。客戶(hù)機(jī)是與“協(xié)作服務(wù)器”通信的單個(gè) Eclipse 平臺(tái)實(shí)例,而協(xié)作服務(wù)器也是一個(gè) Eclipse 插件。Koi 使用以 JDBC 訪(fǎng)問(wèn)的關(guān)系數(shù)據(jù)庫(kù)作為數(shù)據(jù)存儲(chǔ)。可在參考資料中找到指向完整的、經(jīng)過(guò)分類(lèi)的 Eclipse 插件注冊(cè)表的鏈接。
- 請(qǐng)參加 eclipse.org 上的 Eclipse 平臺(tái)社區(qū)。Eclipse 平臺(tái)源代碼遵循 Common Public License。Eclipse.org 還有一個(gè) Eclipse 項(xiàng)目的術(shù)語(yǔ)和描述詞匯表,以及技術(shù)文章和新聞組。Eclipse 平臺(tái)白皮書(shū)(可在 Eclipse.org 主頁(yè)獲取)詳細(xì)描述了 Eclipse 的主要組件和功能。
- 從 eclipse.org 下載 KOI 插件。
- 查看 Eclipse 插件的完整的、經(jīng)過(guò)分類(lèi)的注冊(cè)表。
- 從 CVS 主頁(yè)或 LORIA 站點(diǎn)下載 CVS 客戶(hù)機(jī)、服務(wù)器和源代碼。
- 請(qǐng)參閱 developerWorks 文章“Working the Eclipse Platform”,以了解關(guān)于 Eclipse 平臺(tái)的背景知識(shí)。
- 請(qǐng)參閱 developerWorks 文章“Getting started with the Eclipse Platform”,這篇文章介紹了用 Eclipse 平臺(tái)以及使用 Eclipse 插件編輯、編譯和調(diào)試應(yīng)用程序。
- 請(qǐng)參閱 developerWorks 文章“開(kāi)發(fā) Eclipse 插件”,這篇文章介紹了如何開(kāi)發(fā) Eclipse 插件。
- 從 developerWorks 的這些文章中獲取關(guān)于 Eclipse 的更多信息:
- 在 developerWorks 開(kāi)放源碼項(xiàng)目專(zhuān)區(qū)查找更多有關(guān) Eclipse 和開(kāi)放源碼參考資料。
關(guān)于作者 Pawel Leszek 是 Studio B 的一位作家,他是一位專(zhuān)長(zhǎng)于 Linux/Win/Mac OS 系統(tǒng)體系結(jié)構(gòu)和管理的獨(dú)立軟件顧問(wèn)和作家。他具有許多操作系統(tǒng)、編程語(yǔ)言和網(wǎng)絡(luò)協(xié)議方面的經(jīng)驗(yàn),尤其是 Lotus Domino 和 DB2 方面。Pawel 還在 LinuxWorld 上發(fā)表過(guò)一系列文章,他是 PC World 波蘭版的 Linux 專(zhuān)欄作家。Pawel 和他的妻子以及可愛(ài)的小女兒住在華沙。歡迎提問(wèn)并提出意見(jiàn);您可以通過(guò) pawel.leszek@ipgate.pl 與 Pawel 聯(lián)系。 |