在團隊項目中共享源代碼
現今的大多數應用程序是由多人組成的團隊開發的。即使只涉及幾個開發人員的小項目,也需要對源代碼的更改進行嚴格控制。這就是源代碼管理軟件的任務。源代碼版本控制軟件必須支持兩個核心功能:
提供一種方法,能夠協調對源代碼的更改,並能集成這些更改
團隊所提交工作的歷史記錄
當團隊成員完成新的工作時,通過將這些更改提交到資源庫來共享他們的工作。類似地,當他們希望獲得最新可用的工作成果時,就可以根據資源庫中的更改,更新自己的本地工作空間。這意味著項目資源庫會因團隊成員提交新工作成果而經常發生更改。換句話說,資源庫應該表示項目的當前狀態。任何時候,團隊成員都要能夠根據資源庫更新自己的工作空間,並確信它們是最新的。
維護歷史記錄也很重要,那樣就可以將當前工作與先前版本進行比較,如有必要,還可以回復到先前版本。協調團隊的工作,以便只存在唯一的當前項目狀態定義,以及包含團隊已集成的工作,這些對於管理版本控制也是十分必要的。這種協調有可能是最難實現的目標。
最理想的模型是:團隊的任何成員都可以對自己有權訪問的任何資源進行更改。因為兩個團隊成員可以提交對同一資源的更改,所以有可能發生沖突,必須解決這種沖突。這種模型假定沖突具有唯一性。但遺憾的是,沒有任何源代碼是孤立地存在的;通常它包含與其它資源隱式或顯式的相關性。源代碼引用了在其它源代碼資源中描述的構件。但源代碼管理軟件的工作就到此為止了,因為它並不能取代項目管理。項目管理者必須履行其職責:協調其它成員的工作以及負責進度、項目階段和發布日期。此外,源代碼管理也不能替代開發人員之間的交流。
Eclipse 平台如何支持代碼管理
Eclipse 平台提供了作為團隊在軟件項目中共享代碼和工作的能力。Eclipse 廣泛地支持各種代碼管理解決方案,這要歸功於它的插件體系結構(不過,現已推出了對 CVS 的支持)。Eclipse 平台體系結構的重點在於 工作空間。工作空間維護構建和測試軟件項目所需的一切。它包含對象(源代碼和資源)。它還保存了用於項目、IDE 和插件的配置設置。工作空間是在開發人員的機器上本地進行維護的,而團隊通過外部資源庫進行協作,不同開發人員的代碼在資源庫進行匯集。可以經由因特網通過“客戶機-服務器”體系結構訪問資源庫。
Eclipse 平台提供了對於直接從工作空間進行團隊開發操作的支持。這種支持允許開發人員並發地與幾個獨立的資源庫以及不同版本的代碼或項目進行交互。工作空間中的資源允許團隊支持組件處理版本和配置管理問題。當然,單個工作空間可以同時訪問不同類型的資源庫。Eclipse 平台並沒有提供它自己的代碼管理解決方案;它總是依靠外部系統。Eclipse 平台只對一個(但也是最流行的一個)源代碼管理系統提供內置支持:並發版本控制系統(Concurrent Versions System,CVS)。 對第三方代碼管理應用程序的支持一節中描述了使用第三方插件支持其它資源庫。
CVS 是什麼?
CVS 誕生於 1986 年,當時作為一組 shell 腳本而出現,但它現在已經發展成了最流行的針對軟件開發人員的源代碼版本管理解決方案。CVS 是用於代碼版本管理的開放源碼的客戶機/服務器解決方案,它可用於各種平台,包括 Linux 和 Windows NT/2000/XP。
通常,CVS 的主要功能是記錄源文件的歷史。當一組開發人員從事同一個項目時,CVS 將他們彼此隔離開來。每個開發人員都在他/她自己的目錄中獨立工作,然後使用 CVS 資源庫(不時地)合並工作結果。
Eclipse 擁有與 Eclipse 平台 IDE 緊密集成的內置 CVS 客戶機,它是作為一個單獨透視圖(CVS Repository Exploring 透視圖)而實現的,用於與 CVS 的交互。用於 CVS 的通用 Eclipse 設置(General Eclipse settings for CVS)位於 Window -> Preferences window -> Team下。在切換到 CVS Repository Exploring 透視圖之後,就可以使用所有 CVS 操作了(轉至 Window -> Open Perspective -> Other -> CVS Repository Exploring菜單 — 請參閱 圖 1和 圖 2)。
圖 1. 切換到 CVS Repository Exploring 透視圖
首先設置資源庫的位置,它將定義用於選定 CVS 服務器/資源庫的連接參數。請確保使用 SSH 隧道( extssh )。
圖 2. 浏覽 CVS Repository Exploring 透視圖中的 CVS 資源庫
Eclipse/CVS 的源代碼工作流
在 CVS 團隊協作模型中,團隊成員彼此獨立地在他們各自的工作台上完成自己的所有工作。最後,他們希望共享其工作。他們通過 CVS 資源庫實現這一點。CVS 使用分支(branch)模型來支持彼此獨立而又高度相互依賴的多個工作流程(course of work)。這些分支是開發團隊用來共享和集成正在進行中的工作的地方。可以認為 分支是一個共享的工作台,當團隊成員對源代碼進行更改時就更新這個工作台。這個模型允許從事 CVS 團隊項目的每個開發人員在進行更改時與其他成員共享其工作,以及在項目進展期間訪問其他成員的工作。
一個稱為 HEAD的特殊分支用來表示資源庫中的主要工作流程(HEAD 通常被稱為 主干)。當團隊成員將資源提交給該分支時,會影響這些相關性。確保相關性的完整性是很重要的,因為該分支表示了當前項目的狀態。當然,任何時候,團隊成員都可以使用該分支的內容作為新工作的基礎。
那些規則不僅適用於 CVS:無論使用哪種版本控制軟件,團隊項目中都有一些用於源代碼管理的常見步驟。下面是一個使用 Eclipse 內置的 CVS 支持的示例工作流:
1. 啟動新的團隊項目
每個新的空 Eclipse 項目都可以通過 CVS(或受支持的任何其它源代碼管理系統)進行共享。開發人員也可以通過將其現有的代碼遷移到資源庫來共享它。要進行共享,單擊項目主文件夾,在顯示的上下文菜單中使用 Team -> Share Project選項,如 圖 3所示。
圖 3. 使用 CVS 資源庫共享本地項目
另一個選項是通過從選定的 CVS 資源庫分支導入代碼來創建新的工作台項目。只要選擇適當分支(或 HEAD),然後選擇從 CVS Repository Exploring 透視圖中的上下文菜單中選擇“Checkout As Project”選項,如 圖 4所示。
圖 4. 從現有的 CVS 資源庫創建新項目
2. 使用代碼並進行更改
開發人員通過 Eclipse 工作台在本地使用代碼,包括的工作有創建新資源、修改現有資源、編寫注釋,並在他們使用後在本地保存這些內容。
3. 使本地更改與 CVS 資源庫同步
如果一個項目開發人員准備提交他/她的工作,那麼首先要執行更新操作。這會針對引入的更改核對資源庫,並將這些更改添加到該開發人員的本地工作台。這樣確保了開發人員知道這些更改可能會影響他/她將要提交的工作的完整性。使用項目上下文菜單中的 Compare With...選項將本地版本與資源庫中存儲的代碼進行比較(請參閱 圖 5)。
圖 5. 比較本地版本與資源庫中的版本
下一步是解決最後出現的任何沖突,並設法再次編譯代碼。如果一切正常,那麼從項目上下文菜單使用 Team -> Commit...選項執行提交操作,如 圖 6所示。這會使所有更改都集成到資源庫中。
圖 6. 將更改提交到遠程資源庫
4. 管理資源庫
CVS 允許開發人員將更改隔離在開發的某些獨立路徑之內,這些路徑稱為分支。當一個開發人員更改某個分支上的文件時,這種更改不會出現在主干或其它分支上。那些分支被命名為 子版本(subversion)或 代碼分叉(code fork)。稍後,由合並操作將更改從一個分支遷移到另一個分支(或主干)。然後提交這些修訂。這樣就有效地將更改復制到了另一個分支上。使用項目上下文菜單的 Team -> Branch...選項,Eclipse 使開發分支之間的遷移變得容易。
當然,當開發團隊維護大型資源庫時,有必要控制項目內的提交和合並操作。Eclipse/CVS 集成提供了一種特殊的視圖:CVS Repository History(請參閱 圖 7)。它給出了關於團隊成員在資源庫中所執行更改的快速預覽。
圖 7. 在 CVS Resource History 窗口中查看帶注釋的修訂歷史記錄
Eclipse 平台提供了幾個支持代碼管理的實用程序。最有用的是補丁功能。它將出自兩個來源(譬如本地工作台和資源庫)的代碼進行比較,然後創建一個包含代碼差異的類似 UNIX 的補丁文件(請參閱 圖 8)。可以將該文件發送給開發人員以將源代碼升級到最新版本。
圖 8. 創建用於源代碼分發的補丁
5. 斷開項目與 CVS 的連接
當項目開發已經結束,並且團隊希望 凍結源代碼時,可以從 HEAD 資源庫刪除該項目的最終版本。斷開項目與 CVS 的連接將在該項目及其資源上禁用資源庫操作,並刪除與該項目相關聯的 CVS 信息(這一操作是可選的)。
可以通過項目上下文菜單中的 Team -> Disconnect選項執行斷開連接操作。通過選擇這個選項,會打開 Confirm Disconnect from CVS 對話框。在將該項目與資源庫的連接斷開之後,該團隊必須確定如何處理 CVS 信息。第一個選項是“Delete the CVS meta information”;它將禁用 CVS 團隊菜單操作並從文件系統中刪除 CVS 文件夾及其內容。第二個選項是“Do not delete the CVS meta information”;它將禁用 CVS 團隊菜單操作,但保留 CVS 元信息。
對第三方代碼管理應用程序的支持
CVS 有幾個重要的限制:它不能確定單個文件或整個文件集范圍內同時進行的更改,它也不能檢測文件之間的邏輯沖突。其沖突概念純粹是文本意義上的,當對於同一基本文件的兩個更改時間上非常非常接近,從而使合並命令受到干擾時,就會發生沖突。CVS 也不能提供任何類似於消息傳遞這樣的交互式協作工具。幸運的是,CVS 並不是 Eclipse 平台所支持的唯一的源代碼管理軟件。開發人員可以通過插件擴展 Eclipse 平台的功能,而且目前(到 2003 年 3 月 4 日為止)已有 16 個可用於團隊開發軟件的插件。所有插件都是由 Eclipse 社區或商業軟件供應商創建的。這些插件中的大多數添加了對第三方、商業源代碼管理系統的支持。最有價值的插件是那些支持流行的企業代碼管理系統(如 Merant PVCS 和 Rational ClearCase)的插件。例如,CVS-SSH2 插件允許通過 SSH2 會話訪問 CVS,而 Microsoft Visual SourceSafe(VSS)團隊提供程序插件添加了對 MS VSS 產品的支持(也可以在諸如 Linux 這樣的非 Windows 平台上使用)。
但是,我本人所偏愛的插件是 Koi。盡管它並非嚴格用於源代碼控制,但這個創新的工具給協作開發注入了許多新的活力。其當前版本支持工作台到工作台的消息傳遞、共享標記、沖突更改通知、共享日歷和事件通知。Koi 將 XML-RPC 用作其客戶機-服務器體系結構中的通信模型。客戶機是與“協作服務器”通信的單個 Eclipse 平台實例,而協作服務器也是一個 Eclipse 插件。Koi 使用以 JDBC 訪問的關系數據庫作為數據存儲。