级别: 初级 姜昌华 , 华东师范大学计算中心
2006 年 1 月 16 日
版本管理系统可以帮助开发人员有效地管理软件资源的版本问题。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的安装类型
图2:修改CVSNT的安装目录,选择CVSNT的可安装组件
安装完成后可以通过菜单操作【开始】→【CVSNT】→【CVSNT Control Panel】或控制面板打开CVSNT的控制管理台。为了使用CVSNT进行版本管理,首先必须建立一个资源库。在CVSNT的控制管理台中选择"Configuration Repository"面板并单击"Add",出现如图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防火墙控制台
2.在图7中单击"添加端口"按钮,请按图8将CVSNT的服务端口加入防火墙的例外列表。 图8:将CVSNT的服务端口加入防火墙的例外列表
3.在图8中按"确定"按钮就把CVSNT的服务端口加入防火墙的例外列表,见图9。 图9:CVSNT的服务端口已被加入到防火墙的例外列表
如果使用了其他的防火墙产品,也应进行相应的设置。 3.2.3 建立CVS用户 为了在我们的实验环境中模拟多个用户,还需要在CVS服务器中建立至少两个CVS用户。由于CVSNT安装后采用混合认证方式工作,CVS服务器的系统用户和在CVS本身管理的用户文件中定义的用户都能使用CVSNT服务。为了简便,本文建立了两个系统用户。在WINDOWS XP中可以通过计算机管理这一工具追加系统用户,如图6所示。除了管理员帐号jiangch(我将管理员Administrator重命名为jiangch),还添加了一个帐户cvsuser2。 图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服务器的连接
建立连接后,在ECLIPSE的CVS资源库透视图中的结果如图5所示。其中的HEAD表示主分支(主干)、Branches是分支的集合、Versions是标签的集合、Dates是用时间做标签的集合。由于jiangch是管理员帐户,因此还显示了CVSNT的管理文件集合CVSROOT。如果以非管理员帐户连接到CVSNT服务器,则看不到上述CVSROOT。 图5:CVS资源库视图
4.模块的输入与签出 4.1 输入(import) 在正式的项目开发中,输入模块通常由CVS管理人员或项目经理完成,一般的开发人员不需要进行此项工作。在ECLIPSE中,可以将整个项目作为一个模块导入CVS资源库。这也是实际工作中经常采用的工作方式。我们事先在计算机chjnb的ECLIPSE中建立了一个项目UnitTest,如图10所示。 图10:演示用项目的导航器视图
为了将项目导入CVS资源库:打开ECLIPSE,选择希望导入CVS资源库的项目(project),点击右键,在出现的弹出菜单中依次选择【Team】→【Share Project...】,出现图11。 图11:共享项目--选择资源库
点击Next按钮,在下一个对话框中选择"use project name as a module name",再点击Next按钮,此时,出现如图12所示的对话框。 图12:共享项目--控制共享内容
有一些文件,我们不想加入CVS资源库。例如图9中的bin目录,里面放的是编译时生成的class文件。此时,可以在上述对话框的bin目录上点击右键,在出现的弹出菜单中选择【Add to cvsignore...】,出现图13。(注:在preference中也可以进行设定)在图13中单击OK按钮。 图13:共享项目--选择哪类资源不用放入资源库
随后单击图12中的Finish按钮,在接下来的一系列对话框中,选择Yes。随后出现如图14的对话框,在输入框中输入注释,例如:"XXX项目初始化"。 最后单击OK按钮。ECLIPSE将向CVS资源库中导入代码模块。 图14:共享项目--填写注释
模块导入成功后, java视图如图15所示。处于CVS管理状态的目录和文件,其图标的右下角有一个小圆柱。由于在前面的操作中,我们将bin目录排除了,因此bin目录显示为通常的图标。在文件的后面,显示了该文件的修订版号,而在目录的后面则没有,这是因为CVS系统版本管理的对象只是文件,而目录不是CVS版本管理的对象。所有文件的初始修订版号均为1.1。输入成功后,整个项目本身也处于签出的状态。 图15:处于版本管理状态下的项目视图
4.2 签出(checkout) 如果想通过其它计算机上的ECLIPSE获得工作拷贝,按2.2的操作成功建立连接后,CVS Repository透视图见图16。在主分支HEAD下的 UnitTest上点击右键,在出现的弹出菜单中选择【Check Out】,这将签出CVS资源库中的模块UnitTest,并在ECLIPSE建立一个名为UnitTest的新Project。签出成功后转到java视图,会看到一个和图15类似的界面。 图16:在CVS资源库中已经存在一个共享项目UnitTest
在菜单中还有一项【Check Out As...】,通过此菜单项,可以对签出进行更细致的控制,例如,可以更改Project名;可以将签出的内容追加到已有Project中。
结束语 在本系列的第1部分,介绍了CVS的相关术语及小组开发环境的建立过程。在本系列的第2部分,将详细介绍ECLIPSE小组开发环境的使用方法。
参考资料 学习
获得产品和技术
关于作者
|