UML软件工程组织

 

 

ECLIPSE 小组开发环境实践
 
2008-02-22 作者:姜昌华 来源:IBM
 
本文内容包括:

1.前言

2.CVS的相关术语与CVS工作模式

3.环境安装

4.模块的输入与签出

5.日常操作

6.标签与分支

7.结束语

参考资料

版本管理系统可以帮助开发人员有效地管理软件资源的版本问题。CVS(Concurrent Version System)是目前最常用的版本管理系统,而 ECLIPSE 是最流行的开放源码的集成开发环境。在 ECLIPSE 中,与 CVS 相关的功能被统称为小组开发环境。本系列的第 1 部分不仅解释了 CVS 的相关术语,还详细介绍了小组开发环境的建立过程;本系列的第 2 部分则试图以一种简明易懂的方式来讲解 ECLIPSE 小组开发环境的使用方法。

1.前言

版本管理系统可以帮助开发人员有效地管理软件资源(源代码文件、配置文件等)的版本问题。版本管理系统可以帮助开发人员追踪文件的修改履历;防止文件因疏忽而被错误的修改、删除;在小组开发环境中,帮助多个开发人员保持文件的同步;通过文件的修改履历,还可以帮助开发人员发现修改过程中产生的BUG,因此应用CVS可以在一定程度上提高软件的开发效率。现在很多开发工具中都集成了CVS功能,例如ECLIPSE、InteliJ、NetBeans等;虽然ECLIPSE等集成开发环境(IDE)对CVS提供了很好的支持,可以大幅降低CVS的使用难度,但是很多开发人员在使用CVS时还是不知所措。笔者认为这是由于他们不了解CVS的相关术语及CVS的工作模式所致。因此,本文首先介绍CVS的相关术语及CVS的工作模式。然后通过一些实例与应用场景, 展示如何在ECLIPSE中使用小组开发环境。

本文所使用的ECLIPSE没有安装本地语言包插件,操作界面为英文。但理解了相关术语后,读者即使在中文环境中也能正常操作。

2.CVS的相关术语与CVS工作模式

2.1 术语解释

修订版(revision):CVS版本管理系统用修订版来管理文件的修改履历,修订版用版本号来表示,即修订版号。对文件的每次修改(提交)都产生一个新的修订版。

资源库(repository):资源文件的集合,版本管理的容器。在ECLIPSE中被称为CVS存储库。

模块(module):资源文件的组织形式,在版本管理系统中的表现形式为目录(树形结构,可以嵌套)。

输入(import):将处于资源库之外的软件模块登录到资源库。

输出(export):从资源库中取出模块。使用export方式取出的模块拷贝不包含版本管理的相关信息,对该模块拷贝的修改也不能反映到资源库。

工作拷贝(working copy):版本管理系统是一个典型的CLIENT/SERVER系统。用户对资源的修改不是直接在SERVER端进行的,而是根据资源库的内容创建一个本地的工作拷贝,用户在工作拷贝中工作,工作完成后再将修改的内容提交到资源库。

签出(checkout):获得工作拷贝的操作。此前使用过Visual Source Safe的读者需注意,在Visual Source Safe中的checkout用于锁定文件。

签入/提交(checkin/commit):将对工作拷贝的修改反映到资源库中的操作。在CVS中使用的术语是提交;在Visual Source Safe中使用的术语是签入。

更新(update):将资源库中的最新状态反映到工作拷贝的操作。

冲突(conflict):在资源库同工作拷贝之间状态不一致的状态下进行签入或更新操作时,版本管理系统可能会尽量进行合并,如果版本管理系统不能完全处理上述不一致,就称之为产生了冲突。

快照(snapshot):在某一时刻,模块中文件状态(包括文件内容及其版本管理元信息)的静态影像。

标签(tag):由于CVS以文件为版本管理的基本单位,随着开发的进行,对不同的文件的修改次数是不一样的,各个文件的修订版号会因此而变得参差不齐。这不便于模块的管理。为此可以对某个时刻的快照赋予一个标识名称,标识名称就被称为标签。将来通过标签就可以获得模块在该时刻的快照。通过标签所获得的快照是静态的,不能被修改。在ECLIPSE中,标签与版本(Version)是同义词,一般都用于文件集合。需要指出的是:在很多中文资料里,修订版与版本往往不加区分,有时会将单个文件的修订版也称为版本。例如,"A文件最新版本是1.3",这句话中的版本实际上指的是修订版。因此,需要根据上下文来确定版本的意义。

分支(branch):分支是一种特殊的标签。从分支中签出的资源是可以被修改的。引入分支是为了更好地支持项目的并行开发过程。

2.2 工作模式

为了解决因多人同时开发而可能产生的冲突问题,版本管理系统有两种常用的工作模式。

模式一:锁定-修改-解锁模式

在这种工作模式中,一个开发人员为了能够修改文件,首先必须锁定文件,锁定文件操作赋予了开发人员修改文件的权力。从一个文件被锁定后到其被解锁前,其他的开发人员不能再锁定该文件。这种工作模式适用于小规模的开发小组。如果采用这种工作模式,开发人员应尽量少、尽可能晚地锁定文件并尽可能早解锁文件。模式一是Visual Source Safe的缺省工作模式。

模式二:拷贝-修改-合并模式

在这种工作模式中,每个开发人员都从资源库获得自己的工作拷贝,然后就可以自由的在工作拷贝中继续开发,开发完成后再向资源库提交自己的工作成果。如果在提交时产生了冲突,则必须在解决冲突后才能再提交。模式二比模式一具有更好的并发性,因而也适用于中、大规模的开发小组。模式二是CVS所采用的工作模式。

锁定-修改-解锁模式是一种悲观的锁定模式,它假定在开发过程中可能会产生大量的冲突;而拷贝-修改-合并模式则比较乐观,它假定在开发过程中软件的设计及开发任务的分配都比较合理(软件的模块化程度高,开发人员一般各司其职),在开发过程中即使会产生冲突,但产生冲突的机率比较小。为了更好地使用CVS,我们在使用CVS时也应该遵循它的设计前提,努力提高软件的设计水平及项目管理的能力,否则将陷入疲于解决提交冲突的尴尬境地。

如果想进一步了解CVS的理论知识,请参看文后的参考资料1和参考资料2。

3.环境安装

LINUX与WINDOWS是目前应用最普及的操作系统。下面首先介绍CVS服务器在两种操作系统上的安装与配置过程,然后介绍如何从ECLIPSE连接CVS服务器,最后介绍如何使用ECLIPSE共享模块。无论后台的CVS安装在何种操作系统之上,对于ECLIPSE来说,与CVS服务器建立了连接之后其使用方法是一样的。

3.1 在FEDORA CORE3上安装、配置CVS

3.1.1 安装CVS

本文所使用的LINUX发行版为FEDORA CORE3。首先,查看在系统中是否已经安装了CVS服务器,如果没有安装,则可以从FEDORA CORE3的发行光盘或从网络上下载相应的软件包,本文中使用的软件包为cvs-1.11.17-7.FC3.i386.rpm。安装过程如下(在本节中,绿色的为命令行,紧随命令行的黑色文本为系统响应):

[root@emulator cvsres]#  rpm -ivh cvs-1.11.17-7.FC3.i386.rpm
warning: cvs-1.11.17-7.FC3.i386.rpm: V3 DSA signature: NOKEY, key ID 4f2a6fd2
Preparing...                ########################################### [100%]
   1:cvs                    ########################################### [100%]

可以用如下命令查询系统中是否已经安装了CVS服务器:

[jiangch@emulator ~]$ rpm -qa | grep cvs
cvs-1.11.17-7.FC3

确认在文件/etc/services中含有以下内容:

cvspserver      2401/tcp                        # CVS client/server operations

在目录/etc/xinetd.d中建立一个文件cvspserver,文件内容如下:

service cvspserver
{
        socket_type	= stream
        protocol		= tcp
        wait			= no
        user			= root
		passenv		= PATH
        server		= /usr/bin/cvs
        server_args	= --allow-root=/home/jiangch/cvsrepo pserver -f
}

其中,--allow-root的值为CVS资源库的根目录。如果建立自己的CVS服务器,需要根据实际情况作相应的修改。

3.1.2 启动CVS服务

在FEDORA CORE中的CVS服务由xinetd管理,安装完成后通过下面的命令可以启动CVS服务:

[root@emulator cvsres]#  /etc/init.d/xinetd restart
Stopping xinetd:                                          [  OK  ]
Starting xinetd:                                           [  OK  ]

3.1.3 初始化资源库

在LINUX中,可以用下面的命令初始化CVS资源库:

[root@emulator cvsres]#  cvs -d /home/jiangch/cvsrepo init

3.1.4 添加CVS用户

初始化资源库后,会在CVS资源库的根目录下生成一个新的目录CVSROOT。在目录中新建一个名为passwd的文件,为了简便,文件内容的格式为:
用户帐号:密码
每个用户一行,用户帐号应在系统中存在。由于密码必须是加密的,可以从文件/etc/shadow中提取。这样CVS用户将与LIUNX系统用户具有相同的帐号和密码。

3.1.5 注意事项

在缺省状态下LIUNX的安全性比较高,对目录、文件的读写操作有较严格的控制。为了在LINUX下方便的使用CVS,最好建立一个组(group),例如"cvsusers",将CVS的用户都加入"cvsusers"中。这样一来,只要将CVS资源库根目录及其所有子目录(含目录中的所有文件)的读写权限赋予组"cvsusers",组中的所有用户都能使用CVS。

3.2 在WINDOWS XP上安装、配置CVSNT

本文以下的内容都基于WINDOWS XP+CVSNT+ECLIPSE。整个实验环境包括两台以WINDOWS XP2为操作系统的计算机,其中一台名为"chjnb"的计算机既作为CVS服务器又安装了ECLIPSE作为客户端,而另一台只安装了ECLIPSE。CVSNT与ECLIPSE都采用了本文写作时的最新版本,分别是CVSNT2.5.03.2151和ECLIPSE3.1.1。ECLIPSE3.1.1可以和CVSNT2.0.58b以上版本很好的协同工作(见参考资料3)。

CVSNT最初起源于CVS,也是一个开放源码产品,具有跨平台的能力,可以运行在多种操作系统之上。WINDOWS版的CVSNT在安装和使用上都比较方便,对WINDOWS用户而言具有很强的亲和力。WINDOWS版的CVSNT经过多年的发展,其功能与稳定性得到不断的加强,完全可以胜任实际工作中的版本管理任务。而且相对于CVS而言,CVSNT还扩展了不少功能。CVSNT与CVS的比较请参看参考资料4。

3.2.1 安装CVSNT

CVSNT可以从以下地址获得http://www.march-hare.com/cvspro/。在WINDOWS系统上CVSNT有安装程序cvsnt-2.5.03.2151.msi(随版本的不同文件名也不同)。一般采取缺省安装方式安装后,CVSNT即可正常工作,如果想控制安装过程,则可以选择定制安装方式。例如在图1、图2中修改了安装目录。

图1:选择CVSNT的安装类型
图1:选择CVSNT的安装类型

图2:修改CVSNT的安装目录,选择CVSNT的可安装组件
图2:修改CVSNT的安装目录,选择CVSNT的可安装组件

安装完成后可以通过菜单操作【开始】→【CVSNT】→【CVSNT Control Panel】或控制面板打开CVSNT的控制管理台。为了使用CVSNT进行版本管理,首先必须建立一个资源库。在CVSNT的控制管理台中选择"Configuration Repository"面板并单击"Add",出现如图3所示的画面。

图3:初始化资源库
图3:初始化资源库

在Location中填入资源库的位置,在Description中填写该资源库的说明信息(可以为空)。值得注意的是当Location包含多级目录时,Name输入框中的缺省值不对,需要修改,例如可以使用最后一级目录名,如图3。最后点击"OK"按钮,在随后出现的询问是否初始化资源库的确认对话框中选择"Yes"即可。

3.2.2 Windows防火墙

如果在安装有CVS服务器的计算机上使用的是WINDOWS XP2操作系统,并且WINDOWS XP2自带的Windows防火墙处于启用状态,则不能从其它计算机连接CVS服务器。读者可以暂时关闭Windows防火墙或者将CVSNT服务的端口号(2401)添加到Windows防火墙的例外中,其设置步骤如下:

1.从WINDOWS操作系统的控制面板中双击"Windows防火墙"的图标,出现如图7所示的画面。

图7:Windows防火墙控制台
图7:Windows防火墙控制台

2.在图7中单击"添加端口"按钮,请按图8将CVSNT的服务端口加入防火墙的例外列表。

图8:将CVSNT的服务端口加入防火墙的例外列表
图8:将CVSNT的服务端口加入防火墙的例外列表

3.在图8中按"确定"按钮就把CVSNT的服务端口加入防火墙的例外列表,见图9。

图9:CVSNT的服务端口已被加入到防火墙的例外列表
图9:CVSNT的服务端口已被加入到防火墙的例外列表

如果使用了其他的防火墙产品,也应进行相应的设置。

3.2.3 建立CVS用户

为了在我们的实验环境中模拟多个用户,还需要在CVS服务器中建立至少两个CVS用户。由于CVSNT安装后采用混合认证方式工作,CVS服务器的系统用户和在CVS本身管理的用户文件中定义的用户都能使用CVSNT服务。为了简便,本文建立了两个系统用户。在WINDOWS XP中可以通过计算机管理这一工具追加系统用户,如图6所示。除了管理员帐号jiangch(我将管理员Administrator重命名为jiangch),还添加了一个帐户cvsuser2。

图6:添加用户帐号
图6:添加用户帐号

现在可以在另一台计算机的ECLIPSE中,以cvsuser2为用户名建立与CVSNT服务器的连接。至此,我们就建立了一个完整的实验环境。本文的实验环境用了两台计算机,如果计算机的内存够大,也可以在一台计算机上建立一个完整的实验环境。

3.3 建立ECLIPSE与CVS服务器的连接

ECLIPSE可以从http://www.ECLIPSE.org/download下载。ECLIPSE无需安装,在已安装JRE或JDK1.4.2或以上版本的计算机上,只要将下载的文件解压后即可运行。为了能在ECLIPSE使用CVS,需要建立ECLIPSE与CVS服务器的连接。其操作步骤如下:

1.打开CVS Repository视图(Perspective),可以通过如下菜单操作实现:【Window】→【Open Perspective】→【Other...】。在出现的对话框中选择CVS Repository Exploring。

2.在CVS Repository视图中单击右键,选择【New】→【Repository Location...】(在ECLIPSE中,如果菜单项的后面有省略号,则表示选择该菜单项后,将出现对话框供用户进一步设定相关信息)。出现如图4所示对话框。在对话框中填入适当的信息即可。例如,根据图中的示范信息,将与我们在前面步骤所安装的CVSNT服务器建立连接。需注意的是:在Host输入框中可以输入CVS服务器的名字或IP地址;在连接类型下拉框中选择pserver,这是CVSNT+ECLIPSE最简便的配置方式。

图4:在ECLIPSE中建立与CVSNT服务器的连接
图4:在ECLIPSE中建立与CVSNT服务器的连接

建立连接后,在ECLIPSE的CVS资源库透视图中的结果如图5所示。其中的HEAD表示主分支(主干)、Branches是分支的集合、Versions是标签的集合、Dates是用时间做标签的集合。由于jiangch是管理员帐户,因此还显示了CVSNT的管理文件集合CVSROOT。如果以非管理员帐户连接到CVSNT服务器,则看不到上述CVSROOT。

图5:CVS资源库视图
图5:CVS资源库视图

4.模块的输入与签出

4.1 输入(import)

在正式的项目开发中,输入模块通常由CVS管理人员或项目经理完成,一般的开发人员不需要进行此项工作。在ECLIPSE中,可以将整个项目作为一个模块导入CVS资源库。这也是实际工作中经常采用的工作方式。我们事先在计算机chjnb的ECLIPSE中建立了一个项目UnitTest,如图10所示。

图10:演示用项目的导航器视图
图10:演示用项目的导航器视图

为了将项目导入CVS资源库:打开ECLIPSE,选择希望导入CVS资源库的项目(project),点击右键,在出现的弹出菜单中依次选择【Team】→【Share Project...】,出现图11。

图11:共享项目--选择资源库
图11:共享项目--选择资源库

点击Next按钮,在下一个对话框中选择"use project name as a module name",再点击Next按钮,此时,出现如图12所示的对话框。

图12:共享项目--控制共享内容
图12:共享项目--控制共享内容

有一些文件,我们不想加入CVS资源库。例如图9中的bin目录,里面放的是编译时生成的class文件。此时,可以在上述对话框的bin目录上点击右键,在出现的弹出菜单中选择【Add to cvsignore...】,出现图13。(注:在preference中也可以进行设定)在图13中单击OK按钮。

图13:共享项目--选择哪类资源不用放入资源库
图13:共享项目--选择哪类资源不用放入资源库

随后单击图12中的Finish按钮,在接下来的一系列对话框中,选择Yes。随后出现如图14的对话框,在输入框中输入注释,例如:"XXX项目初始化"。 最后单击OK按钮。ECLIPSE将向CVS资源库中导入代码模块。

图14:共享项目--填写注释
图14:共享项目--填写注释

模块导入成功后, java视图如图15所示。处于CVS管理状态的目录和文件,其图标的右下角有一个小圆柱。由于在前面的操作中,我们将bin目录排除了,因此bin目录显示为通常的图标。在文件的后面,显示了该文件的修订版号,而在目录的后面则没有,这是因为CVS系统版本管理的对象只是文件,而目录不是CVS版本管理的对象。所有文件的初始修订版号均为1.1。输入成功后,整个项目本身也处于签出的状态。

图15:处于版本管理状态下的项目视图
图15:处于版本管理状态下的项目视图

4.2 签出(checkout)

如果想通过其它计算机上的ECLIPSE获得工作拷贝,按2.2的操作成功建立连接后,CVS Repository透视图见图16。在主分支HEAD下的 UnitTest上点击右键,在出现的弹出菜单中选择【Check Out】,这将签出CVS资源库中的模块UnitTest,并在ECLIPSE建立一个名为UnitTest的新Project。签出成功后转到java视图,会看到一个和图15类似的界面。

图16:在CVS资源库中已经存在一个共享项目UnitTest
图16:在CVS资源库中已经存在一个共享项目UnitTest

在菜单中还有一项【Check Out As...】,通过此菜单项,可以对签出进行更细致的控制,例如,可以更改Project名;可以将签出的内容追加到已有Project中。

5.日常操作

在具有版本管理的小组开发环境中,有些操作是开发人员几乎每天都要进行的,如提交修改工作、更新本地工作拷贝、解决冲突等。下面将详细介绍在ECLIPSE中如何实现这些日常操作。在进行这些操作前,都需要先建立与CVS服务器的连接。在ECLIPSE中进行这些操作时,如果是对目录进行操作,则ECLIPSE会自动对该目录下的子目录和文件进行相同的操作,对目录的操作是递归嵌套的。本文在下面的讲解中只以文件操作为例,但这些操作也适用于目录。一般来说,如果在某个目录下要对多个文件进行相同的操作,则选择目录操作比较简便。另外,如不特别说明,CVS资源库中的文件指的是属于主分支HEAD的文件。

5.1 提交(commit)

下面分四种不同的工作场景介绍如何将对工作拷贝的修改反映到CVS资源库。

a.签出模块后,在本地(Local)对文件进行了修改,CVS资源库中的文件没有变化。

在工作拷贝中对SimpleTest.java作一些改动并保存,此时ECLIPSE的画面见图17。在改动的文件及其所属的目录前都出现一个箭头,在希望提交的文件上点击右键,在出现的弹出菜单中选择【Team】→【Commit...】,在随后出现的对话框中输入注释后单击OK按钮。虽然注释不是必须输入的,但是,最好养成在每次提交时写注释的良好习惯,这在实际的系统开发过程中是很有必要的。提交成功后文件的修订版本号会自动增加,如图18所示,SimpleTest.java的修订版号从1.1变成了1.2。

图17:在ECLIPSE中能明确地标识被修改过的工作拷贝
图17:在ECLIPSE中能明确地标识被修改过的工作拷贝

图18:提交修改后,修订版号自动增加
图18:提交修改后,修订版号自动增加

b.签出模块后,在项目中新建了新文件,希望将新建的文件追加到CVS资源库中。

在新建的文件上点击右键,在出现的弹出菜单中选择【Team】→【Add to Version Control】。需要注意的是:上述操作并没有把新建的文件追加到CVS资源库中,为了把新建的文件追加到CVS资源库中,还要执行下列操作:在新建的文件上点击右键,在出现的弹出菜单中选择【Team】→【Commit...】。

c.签出模块后,在项目中删除了文件,希望在CVS资源库中也删除相应的文件。

首先在项目中删除文件,然后在被删除文件的父目录上点击右键,在出现的弹出菜单中选择【Team】→【Commit...】。值得指出的是:上述操作只是将被删除的文件从主分支上删除了,但并没有从CVS资源库中被完全删除,也不应该从CVS资源库中被完全删除,因为某个标签或分支可能需要被删除的文件。

如果想恢复被删除的文件,在ECLIPSE的Navigator视图中选中被删除的文件的父目录,在右键菜单中选择【Team】→【Restore from Repository...】,然后在出现的对话框中选择希望从哪个修订版恢复被删除文件的内容。

d.签出模块后,在本地(Local)对文件进行了修改,但在提交之前,其他的开发人员已经对同一个文件进行了修改并提交到CVS资源库中。

此时,由于CVS资源库中该文件的修订版本号将高于本地该文件的修订版本号,因此将不能提交该文件。如果试图提交该文件,ECLIPSE将弹出一个错误对话框,见图19。在这种情况下,为了能提交修改必须首先解决冲突。详细操作见下文的冲突解决。

图19:在冲突状态下提交将出现错误
图19:在冲突状态下提交将出现错误

在小组开发环境中,应该经常性地提交自己的工作成果,但也不能随意提交。一般来说,以提交的更改不对其他开发人员造成妨碍为前提条件。例如,提交的代码应能够被正常编译。如果在小组开发环境中还使用了诸如CHECKSTYLE之类的代码审查工具,则提交的代码除了能够被正常编译之外,还应能通过代码审查工具的审查。

5.2 更新(Update)

在系统的开发过程中,开发人员不应只关注自己的开发,还应尽量与其他开发人员保持同步,也就是需要经常地将其他开发人员的开发成果更新到本地的工作拷贝中。

a. CVS资源库中的文件被更新了,但本地文件没有更新。

在开发小组中,可能有部分开发人员负责一些通用模块的开发,而其余的开发人员则专注于业务系统的开发。在这样的开发场景中,业务系统的开发人员就应经常更新通用模块,保持工作拷贝中的通用模块与CVS资源库中通用模块的同步。在文件上点击右键,在出现的弹出菜单中选择【Team】→【Update...】。本地文件的内容将被替换为CVS资源库中相应文件的内容。

b. CVS资源库中的文件没有被更新,但本地文件被更新了。

此时,由于本地文件的修订版号与CVS资源库中文件的修订版号相同,更新操作实际上什么也不做。

c. CVS资源库中的文件和本地文件都被更新了。

此时,ECLIPSE会尽量将CVS资源库中的内容合并到本地文件中。如果在合并过程中没有发现冲突,则合并后的文件将包含本地修改和其他开发人员的修改;如果在合并过程中产生了冲突,则ECLIPSE会在合并文件中着重显示相冲突的部分,并将原本地文件作一个备份。图20~23演示了这一过程。cvstest.txt文件1.2版本的三行的内容分别为test line1、test line2、test line3。用户jiangch将文件内容修改并保存后的结构如图20,在jiangch提交之前,用户cvsuser2已将文件内容修改并提交,此时CVS资源库中cvstest.txt的修订版号为1.3,见图21。

图20:存在冲突的更新1--用户jiangch的修改结果
图20:存在冲突的更新1--用户jiangch的修改结果

图21:存在冲突的更新2--用户cvsuser2修改并提交后的结果
图21:存在冲突的更新2--用户cvsuser2修改并提交后的结果

用户jiangch在文件cvstest.txt上进行更新操作后的结果见图22。

图22:存在冲突的更新3--用户jiangch进行更新操作后的结果
图22:存在冲突的更新3--用户jiangch进行更新操作后的结果
 

第二行保持不变,但产生冲突的第一、三行则被标记出来了。cvstest.txt的修订版号也变为1.3并处于已修改状态,新产生的文件.#cvstest.txt.1.2是修订版号1.2的备份文件。通过手工将jiangch与cvsuser2的修改内容合并后就可以进行提交操作了,图23是一个合并后提交的结果。


图23:存在冲突的更新4--用户jiangch合并后提交
图23:存在冲突的更新4--用户jiangch合并后提交

5.3 冲突解决

ECLIPSE为CVS的操作提供了一个非常实用的功能:同步透视图(Team Synchronizing Perspective)。通过同步透视图,我们可以在提交、更新操作之前就发现可能存在的冲突。使用ECLIPSE小组开发环境的开发人员都应该熟悉同步透视图的使用。图21~24演示了如何使用同步透视图。在cvstest.txt 1.6与cvstest2.txt1.13的基础上用户jiangch对这两个文件进行了修改并保存。此时的结果如图24。

图24:冲突解决1--用户jiangch的修改结果
图24:冲突解决1--用户jiangch的修改结果

用户cvsuser2也在cvstest.txt 1.6、cvstest2.txt 1.13、TextRunnerTest.java1.1的基础上对这三个文件进行了修改并将修改结果提交到了CVS资源库。其结果见图25。

图25:冲突解决2--用户cvsuser2修改并提交后的结果
图25:冲突解决2--用户cvsuser2修改并提交后的结果

如果用户jiangch不能确定只有他一个人会修改这两个文件,他可以在如图21的画面上选择这两个文件并点击右键,在出现的弹出菜单中选择【Team】→【Synchronize with Repository...】,出现如图26所示的画面。图中①②③④所标识的按钮是过滤器,分别对应4种模式,可以控制在同步视图中显示何种状态的文件。

①:Incoming模式,显示CVS资源库中修订版号高于工作拷贝的文件。在实际工作中,可以选中此类文件并在右键菜单中选择【Update】。也就是将其它开发人员的开 发成果反映到自己的工作拷贝中,保持与其它开发人员的同步。

②:Outgoing模式,显示工作拷贝作了修改的文件。在实际工作中,可以选中此类文件并在右键菜单中选择【Commit】。也就是将自己的开发成果反映到CVS资源库。

③:双向模式,显示所有不同步的文件。包含模式①、模式②、模式④。

④:冲突模式,只显示在本地拷贝与CVS资源库都修改过且产生了冲突的文件。模式①-模式③包含了冲突模式。

图26:冲突解决3--同步透视图
图26:冲突解决3--同步透视图

处于冲突状态下的文件是不能提交的,为了提交产生冲突的文件,首先必须解决冲突。双击产生了冲突的文件,可以在一个特殊的对比编辑器中同时显示本地的工作拷贝文件与CVS资源库中的文件。通过这个编辑器可以方便地看到哪些地方存在冲突并解决冲突。例如在图26中,假定希望将工作拷贝的第一行和CVS资源库的第三行作为最终的修改结果,可以从编辑器的第二列拷贝第三行到第一列的第三行并保存。在同步视图中提交修改的操作:

1.在希望提交的文件上点击右键,在出现的弹出菜单中选择【Team】→【Mark As Merged】,这将使文件从冲突模式变为Outgoing模式。

2.在文件的右键菜单中选择【Team】→【Commit】。图27是提交后的结果画面。同步透视图还包含了很多其它的实用功能,关于同步透视图中各种按钮与右键菜单的说明可以查阅ECLIPSE的联机帮助文档。

图27:冲突解决4--用户jiangch合并后提交
图27:冲突解决4--用户jiangch合并后提交

5.4 比较、替换、修改履历

在软件项目的开发进程中,可能需要参考历史版本的信息,甚至将某个文件的内容回复到某个历史修订版。在ECLIPSE中也提供了这方面的功能。文件或目录的右键菜单【Compare With】提供了和其它修订版相比较的功能;右键菜单【Replace With】提供了将工作拷贝的内容替换为其它修订版内容的功能。例如,我们修改了工作拷贝的某个文件后又想放弃修改内容,此时,可以选中文件并在右键菜单中选择【Replace With】→【Last from Head】(假定CVS资源库没有被其他人员更新过,否则【Replace With】→【Revision...】)。上述操作对目录而言,实际上是对该目录中的所有文件执行操作。

在ECLIPSE中,通过文件的右键菜单【Team】→【Show Resource History】可以方便地查询文件的修改履历,例如文件cvstest.txt在某个时刻查询到的修改履历见图28。从中可以看出谁在什么时候修改了文件的内容,也可以看出在每次提交时都写注释会有助于追踪代码的修改意图及今后的代码维护工作。

图28:文件修改履历
图28:文件修改履历  

6.标签与分支

6.1 标签

考虑下面的应用场景:在项目基本完成的时候,我们希望为此时的文件状态(快照)建立一个标签milestone1。在后续的程序修改过程中,如果发现了一些在版本milestone1中不存在的BUG,我们就可以用milestone1这一统一的标识获取当时的文件快照并与修改后的文件进行对比,而不需要对每个文件都记住其修订版号。

在ECLIPSE中,有两种方法给模块建立标签。方法1.在工作拷贝上建立标签,就JAVA项目而言,可以通过JAVA透视图的右键菜单进行操作;方法2. 在CVS资源库视图中建立标签。在建立标签之前,最好保持工作拷贝与资源库的同步。以方法2为例,在CVS资源库视图的HEAD节点下选中希望建立标签的模块,在出现的右键菜单中选择【Tag as Version...】,在随后出现的对话框中添加标签名即可。图29是对模块UnitTest建立了milestone1和milestone2两个标签后的结果。

图29:建立了两个标签后的CVS资源库视图
图29:建立了两个标签后的CVS资源库视图

标签与文件修订版号的关系见图30。某个标签内各个文件的修订版号可能不同,例如在标签1中,文件A的修订版号是1.2,而文件B的修订版号是1.3;同一个文件的相同修订版号也可能分属于不同的标签,例如在标签1和标签2中,文件B的修订版号都是1.3。

图30:标签示意图
图30:标签示意图

从标签签出的模块是静态的,即使修改了本地的拷贝文件也不能向资源库提交。为了证实这一点,读者可以先签出Versions节点下的模块,在本地做修改后再向CVS资源库提交修改。此时将出现类似图31的错误提示画面。表明提交的文件属于标签milestone1,而milestone1不是分支因而不能提交。

图31:从标签签出的拷贝修改后也不能被提交
图31:从标签签出的拷贝修改后也不能被提交

6.2 分支

6.2.1 建立分支

虽然通过标签可以方便地管理多个文件的修订版号,但是通过标签获得的文件拷贝是静态的,无法在其基础上修改并提交。因此,也就不能支持下面场景中的并发开发。假设某软件公司经过一段时间的开发,发布了产品A的1.0版。为了进一步扩大该产品的市场份额,随即在1.0版本的基础上进一步研发功能更强大的2.0版。但是公司还必须对产品1.0版进行维护和支持,如果用户在1.0版的使用过程中发现了BUG,应能尽快推出1.0修正版并发布相应的补丁程序。也就是说,开发人员要能在1.0修正版与2.0版这两条开发路线上同时工作。建立分支则可以支持上述要求。

与建立标签类似,在ECLIPSE中建立分支也有两种方法。本文以在CVS资源库视图中的操作为例演示分支的建立过程,其步骤如下:

1. 按建立标签的方法建立一个新的标签,例如v1_0。

2. 选中新标签v1_0,在右键菜单中选择【Add to Branch List...】(不限于新标签v1_0,可以在任意标签上操作,但是建立分支应当在关键时刻进行)。

3. 在出现的对话框中输入分支名,例如输入"UnitText1_0_X"并确定,此时就建立了分支。但是,此时的分支是空的,没有与之相关联的资源。

4. 选中新标签v1_0,在右键菜单中选择【Tag with Existing...】,在出现的对话框中打开节点Branches并选择在步骤3新建立的分支UnitText1_0_X,最后按OK按钮确定后就完全建立了一个新的分支,分支建好后的CVS资源库视图如图32所示。


图32:建立分支后的CVS资源库视图
图32:建立分支后的CVS资源库视图

现在,就可以从主分支和UnitText1_0_X分支分别获得工作拷贝。从主分支获得的工作拷贝在提交后将反映到主分支上,而从UnitText1_0_X分支上获得的工作拷贝在提交后将反映到UnitText1_0_X分支中,在主分支和UnitText1_0_X分支上可以互不影响地进行并发开发。结合上述开发场景,产品A 1.0版的修正版对应UnitTest1_0_X分支,而产品A 2.0版可以在主分支上继续开发。

6. 2.2 分支修订版号

分支中的修订版号与主分支中的修订版号略有不同,主分支、分支及修订版号的关系可用图33来说明。

图33:主分支与分支示意图
图33:主分支与分支示意图

图34显示了文件cvstest.txt在UnitTest1_0_X分支上第一次提交后修订版号的变化情况。其修订版号不是从"1.10"转变为"1.11",而是转变为"1.10.2.1"。如果对该文件再进行一次提交,其修订版号将转变为"1.10.2.2"。即变化的是最后一个小数点后的数字。

图34:分支修订版号变化
图34:分支修订版号变化

6.2.3 将分支上的修改合并到主分支

继续2.1中的场景,开发人员在开发产品A 2.0版的同时还对1.0版进行维护。开发人员根据产品A 1.0版用户的反馈修正了一些BUG,由于产品A 2.0版也是基于1.0版继续开发的,他们发现有些BUG在开发中的2.0版中也存在。此时,就希望能将1.0修正版中的修改合并到主分支中。

图35-39演示了分支合并的过程。建立UnitTest1_0_X分支后继续在主分支上修改并提交cvstest.txt,结果如图35所示。

图35:分支合并1--主分支中的文件内容
图35:分支合并1--主分支中的文件内容

从UnitTest1_0_X分支签出一个项目(如果用户jiangch或cvsuser2使用现有的ECLIPSE,则在签出项目时需要选择【Check Out As...】菜单并给项目取一个不同于"UnitTest"的名字),对文件cvstest.txt进行修改并提交,结果如图36所示。从图36还可以看出,从分支签出的项目在项目名称的后面还会注明分支的名称。

图36:分支合并2--UnitTest1_0_X分支中的文件内容
图36:分支合并2--UnitTest1_0_X分支中的文件内容

选择主分支工作拷贝的cvstest.txt,在其右键菜单中选择【Team】→【Merge...】,出现如图37所示的对话框。在"希望被合并的分支或标签"输入框中输入"UnitTest1_0_X";在随后的"通用基版本" 输入框中输入"v1_0",其意义为分支的起源版本(参见本文建立分支的步骤3和步骤4)。

图37:分支合并3--选择希望被合并的分支及其起始标签
图37:分支合并3--选择希望被合并的分支及其起始标签

在图37中点击"Finish"按钮,将出现同步透视图。如果希望将分支中文件内容的第二行合并到主分支中,只需将其从对比编辑器第二列拷贝至第一列,然后在文件的右键菜单中选择【Mark as Merged】(见图38),最后在文件的右键菜单中选择【Commit】。

图38:分支合并4--在透视图中进行合并操作
图38:分支合并4--在透视图中进行合并操作

合并后的结果见图39。

图39:分支合并5--合并后主分支的结果
图39:分支合并5--合并后主分支的结果

7.结束语

本文通过实例讲述了如何在ECLIPSE中使用CVS进行版本管理,由于ECLIPSE内置了丰富的CVS功能,本文的内容不可能面面俱到,例如,本文没有涉及在ECLIPSE中修改CVS的相关设置。想进一步了解相关内容的读者可以参考联机帮助文档及文后的参考资料。另外,限于水平,文中如有不当之处,敬请批评指正。

参考资料

学习

获得产品和技术
 

组织简介 | 联系我们 |   Copyright 2002 ®  UML软件工程组织 京ICP备10020922号

京公海网安备110108001071号