一、版本管理的必要性
如果说70年代的软件危机导致了软件工程思想的诞生和理论体系的发展,那么80~90年代尤其是90年代软件产业的迅猛发展导致了另一种新思想的产生和实现,这就是软件的版本管理。
只要参加过软件开发的人都清楚,现在的软件项目完全由一个人来完成是难以想象而且也是不可能的,通常是有一个研发小组来共同分析、设计、编码和维护,并有专门的测试小组对已完成编码调试的软件进行全面的测试。在软件开发这个庞大而复杂的过程中,需要涉及到各个方面的人员,信息的交流反馈不仅仅是在研发小组的成员之间及各个研发小组之间,还存在于客户和研发者之间。所有的这些交流反馈意见信息都有可能导致对软件的修改,小的可能只是对某个源文件中的某个变量的定义改动,大到重新设计程序模块甚至可能是整个需求分析变动。在这个工程中,由于软件开发所固有的特征,可能会形成众多的软件版本,而且我们并不能保证不出现错误的修改,而这样的一个困难局面却又非常现实地摆在项目开发管理者的面前,他/她该如何有效地解决这些问题,具体地说就是如下一些问题:
1.怎样对研发项目进行整体管理;
2.项目开发小组的成员之间如何以一种有效的机制进行协调;
3.如何进行对小组成员各自承担的子项目的统一管理;
4.如何对研发小组各成员所作的修改进行统一汇总;
5.如何保留修改的轨迹,以便撤销错误的改动;
6.对在研发过程中形成的软件的各个版本如何进行标识,管理及差异识辨等等。
一个非常直接的反应,我们必须要引进一种管理机制,一个版本管理机制,而且是广义上的版本管理,它不仅需要对源代码的版本进行管理,而且还要对整个项目进行管理。以往的那种被誉为具有良好编程风格的做法,诸如在对他人的源程序进行修改时注释修改原因,修改人和日期,如果是多个成员同时进行了修改,那么需要进行及时的人工的差异比较和综合以便形成一个统一的新版本。这种做法在当前的大型软件的开发中已经越来越没有空间了,可以说是一种以小作坊的形式来面对软件的社会化大生产,再也不可能行得通了。
其实,版本管理的思想很早就存在于软件开发者的头脑之中,只是以往的认识没有现在人们所意识到的那样迫切。UNIX的程序开发系统较早就提供了能够进行开发小组中源代码版本管理的工具,现在的Linux更是提供功能强大的能够跨平台的版本管理器,国外公司的基于Windows的版本管理器也已经有了比较成熟的产品,国内的研究单位如北京大学计算机系CASE实验室也在致力于这方面的工作。在众多的成熟产品和试验产品中,这里只将对使用比较广泛,有较大用户前景且又能较易获得的版本管理器产品Microsoft公司的VisualSourceSafe6.0进行详细的介绍,针对普通的研发小组的解决方案,及具体的实现。
二、VisualSourceSafe6.0(VSS6.0)简介
VSS6.0现在是作为MicrosoftVisualStudio6.0这个开发产品家族的一员,如VisualC++6.0和VisualJ++6.0一样。
1.VSS的简单工作原理
Microsoft的VSS6.0解决了软件开发小组长期所面临的版本管理问题,它可能有效地帮助项目开发组的负责人对项目程序进行管理,将所有的项目源文件(包括各种文件类型)以特有的方式存入数据库。开发组的成员不能对该数据库中的文件进行直接的修改,而是由该版本管理器将该项目的源程序或是子项目的源程序拷贝到各个成员自己的工作目录下进行调试和修改,然后将修改后的项目文件作Checkin提交给VSS,由它进行综合更新。VSS也支持多个项目之间文件的快速高效的共享。当某个成员向VSS中添加文件时,该文件将会被备份到数据库中,以便所有的成员都能共享该文件。而且每个成员对所有的项目文件所作的修改都将被记录到数据库中,从而使得修改的恢复和撤销在任何时刻,任何位置都成为可能。小组的成员可能得到该项目的最新版本,对它进行修改,并保存一个新的版本。
VSS的项目组织管理使得开发小组的协调变得简单容易且很直观,当一个和一组文件发放给另一个成员,小组,Web站点或是任何其他的地址,VSS确保他们之间的真正共享及所选的一组文件的不同版本的安全性。现在,越来越多的开发者可以通过他们的开发环境来访问VSS的功能。而且VSS可以很容易地于MicrosoftAccess、VisualBasic、VisualC++、VisualFoxPro和其他的开发工具集成在一起,一旦VSS集成到开发环境中,就可以象控件一样使用,能够很好地体现出VSS的易用性和强大功能。
2.VSS中的几个重要概念
为了更好的了解VSS,有必要对如下一些概念给予说明。
首先是项目的概念,所谓的项目是一组存在VSS中的文件(任何类型),可以在项目中或是项目之间进行文件的添加、删除、编辑和共享。一个项目与操作系统的文件夹有很多的相似之处,但它更好地支持文件合并、历史和版本控制。所有的文件存在VSS数据库的项目中,开发组成员不能在VSS中的主备份文件上工作(除了检查和版本比对等特殊情况外)而是VSS为每个成员在各自的工作目录下提供一个拷贝以供工作。尽管在没有工作目录的情况下也可以查看某个文件,但如要真正在VSS管理下工作,就必须要创建一个工作目录。
VSS能够维护一个文件的多个版本,包括一个从不同版本之间进行修改的记录。版本控制包括如下方面:
组内协调-在一般情况下,确保在任何时刻都只有一个成员对某个特定的文件进行修改,这样可以防止文件被其他成员的修改意外更新。当然,VSS管理员可以改变此缺省设置以允许对单个文件同时有多个Checkout,并且仍禁止对他人的修改进行覆盖。
版本跟踪-对老版本的源代码和其他文件进行归档和跟踪,而且这些版本能够被重新得到以便进行bug跟踪或其他目的。
跨平台开发-支持同一代码在跨多个开发平台时的版本控制。
重用或面向对象代码-跟踪哪些程序使用了哪些代码可被重用的模块。
版本控制的涵义在以后的章节中将会得到更进一步的论述。
我们已经知道,VSS提供版本控制和历史服务,以保证一个文件的每个版本都是可恢复的。VSS用日期/时间戳来记录文件是何时被Checkout或是何时被修改的,它主要有三种方法来跟踪文件和项目的版本:
版本号:这是由VSS维护的内部数码,用户对它没有控制权。每个文件和项目的每个版本都有一个版本号,这些版本号总是一个整数且是递增的。
标签:这些是用户赋给某个项目或文件的某个版本的一个字符串,可以是任何格式的长度不超过31字符的字符串。
日期/时间戳:它给出了一个文件何时最后被修改的信息,或者是一个文件何时被Checkin。VSS同时支持12小时和24小时的时间格式。
工作目录是用户真正对项目文件进行调试修改的地方,当用户Checkout或提取一个文件时,VSS将该项拷贝到用户的工作目录下,当用户修改了该文件并将其Checkin或提交时,VSS再将它从用户的工作目录拷回到VSS的数据库中。在用户作Checkout时,VSS将会自动管理他的工作目录,诸如创建必要的子目录。而且工作目录可以随时创建或修改。
3.VSS6.0的一些新增的特征和功能
归档和恢复-在VSS6.0中这两个操作是在一个用户界面友好的VSS管理员wizard中进行的,而在以前的版本中,它们只能通过命令行来实现。
移动文件-当用户移动文件时,VSS6.0自动将该文件共享到一个新的项目中,并在原项目中将其删除。在新项目中,该文件的属性是共享的。
多个项目之间的差异比较-该功能允许用户在不同的项目之间进行差异比较。
单个文件的展开-在以前的版本中,VSS只能展开一个目录(文件夹),在VSS6.0中,同时可以展开一个文件。
快速提取-由于VSS6.0在性能上的提高,现在的文件提取速度比以往VSS版本的快两倍左右。
历史信息过滤-VSS6.0支持查看那些没有标签的文件和项目的历史。
清除临时文件夹选项-该新功能可使用户很方便地清除临时文件夹。
检查外部的超连接-在VSS的较早的版本中,只有内部的超连接和项目内的跳转才得到检查,VSS6.0允许用户检查项目之外的超连接和跳转。
创建打开VSS数据库的快捷键-用户可以使用VSSExplorer中该新功能创建一个打开某个特定VSS数据库的桌面快捷键。
HTML格式的帮助-VSS的以往版本使用的是WinHelp格式。
三、VSS6.0的解决方案
在对VSS6.0的工作原理,功能和新增特征有了一个较全面的了解后,我们开始进入到本节,即如何运用VSS6.0来实际解决软件开发工程中的版本管理和控制问题,怎样有效地构架一个系统的解决方案。
首先看一下我们的开发小组所处于的实际情况,最一般的情况是整个项目使用的就是微机环境,每个开发者在各自的Windows微机下利用Microsoft的VC、VB、VJ等等来开发项目中各个子项目或子模块,通常这个小组是局域网的一部分或者是一个较为独立的子网,可能配有专门的服务器。这样的一个开发环境对于实现用VSS6.0来进行版本控制和管理是非常有利而且是比较直观的,因为VSS6.0也需要这个网络环境。
其次是对于项目本身来说的,一个项目经过分析设计后一般都会分成若干个子项目由若干个开发小组各自负责编码调试,但软件开发的实际情况决定了各个小组之间并不是完全独立的,他们在很多情况下都需要协调交互和信息反馈,开发过程中的每一步都有可能会导致对前一阶段工作的修正,因为软件开发很大程度上是一个螺旋式的过程,更不用说小组之内的相互交流了。在这个不断交互改动的过程中,将可能形成的项目的阶段版本、部分版本和完整版本的数量是可想而知的,而以往的通常的版本人工管理方法已是不能胜任了。而且还有一个非常重要的方面不可忽略,这对系统软件的开发尤为明显,即软件的层次结构。一般的做法是在通用的系统软件之上为多个应用开发相应的应用程序,与此相对照的项目开发组也一般分为系统开发组和各个应用开发组,应用软件的开发和使用过程中将会反馈回无数的应用本身和系统软件的问题,如果只是针对每个应用来单独修改更新系统软件版本,这样就不可避免地导致多个系统版本的不一致,这样对于真正解决系统所存在的问题就显得力不从心了。而VSS6.0正适合于这种软件的开发体系结构,可以为各个小组创建自己的项目,而这些项目又从属于一个总的项目,所有的修改都将被汇总处理以形成一个统一的最新版本。
针对这样最为普通的一个软件开发环境和组织结构,运用VSS6.0进行版本控制管理的非常有效而且代价较小的解决方案是:
在一台WindowsNT服务器或者是一台较为独立的Windows98/95PC上安装VSS6.0的服务器端软件,创建一个为该整个项目存放用的数据库,然后在该数据库中创建各个项目和子项目,并由VSS管理员为小组的每个成员创建一个帐号及他们各自的权限;
在开发小组其他成员的PC上安装VSS的客户端软件,并创建自己的工作目录,这样在软件的开发过程中,他们只要通过该客户端软件登录到VSS服务器上,Checkout当前要进行工作的项目或文件,如有修改的在工作结束时将其Checkin提交给VSS服务器进行统一更新。
解决方案如图1所示。
四、VSS6.0服务器的安装
在我们给出整个解决方案后,现在来看一下如何安装VSS服务器。VSS6.0是MicrosoftVisualStudio6.0套件的成员,我们就以这个版本为例进行说明。
第一步,将VisualStudio6.0的CD1放入CD-ROM,自动进入安装程序,选择第二项“ServerApplicationsandTools(AddOnly)”,如图2所示;
第二步,然后在“ServerSetups”的“ServerComponents”中选择“VisualSourceSafeServer”,按“Install”按钮后,根据提示放入CD2,如图3所示;
第三步,根据InstallationWizard的提示,继续安装过程,选择安装路径,按图4左上角的按钮,系统继续进行安装,直至提示你重启以使新安装的程序生效,重启计算机。
VSS6.0服务器的安装比较简单,它既可以安装在WindowsNT下,也可以安装在Windows9x下。
五、VSS6.0客户端的安装
在VSS6.0服务器安装完毕后,就可以在VSS管理员的指导下安装客户端的软件。由于我们是在一个Windows环境的子网内,每台PC客户机均可通过网上邻居来访问VSS服务器。在VSS管理员为用户指明VSS客户端软件的安装程序“Netsetup.exe”的位置后,用户可以直接通过资源管理器“Explorer”在网上邻居中找到该程序,并双击以运行它,如图5所示。
Netsetup.exe被启动后进入VSS客户端的安装,在如下提示框中输入用户名和工作组名,如图6所示。
选择VSS的安装路径后,在图7中点击安装图标,进入实际安装步骤,以后的工作将由系统自动完成。
当系统提示你,VSS已成功安装,到此所有的安装工作已经完成。
六、VSS6.0服务器的配置和管理
在VSS6.0服务器安装完毕后,就可以针对开发项目进行VSS服务器的配置和管理,这些工作均需由VSS管理员来完成。
首先,为整个项目创建一个VSS数据库(在VSS服务器安装时,系统已经创建了一个缺省数据库Common),启动VisualSourceSafe6.0Admin(Start/Programs/MicrosoftVisualStudio6.0/MicrosoftVisualSourceSafe/VisualSourceSafe6.0Admin),跳出如图8的窗口,点击下拉菜单Tools中的CreateDatabase...菜单项,将出现如图9的窗口,选择新数据库的路径,例如创建MyApp数据库,然后点击OK按钮,系统将完成创建工作。
第二步,为新创建的数据库(例如MyApp)建立用户,首先需要打开该数据库,点击下拉菜单Users/OpenSourceSafeDatabase...,然后选择数据库MyApp,打开它,如图10所示。再选择菜单项AddUser...,输入用户名和口令,如图11所示。然后依次创建其他的用户。
第三步,在该新建的数据库中创建项目Project。启动MicrosoftVisualSourceSafe6.0(Start/Programs/MicrosoftVisualStudio6.0/MicrosoftVisualSourceSafe/MicrosoftVisualSourceSafe6.0),出现如图12的窗口,点击下拉菜单File中OpenSourceSafeDatabase...,跳出如图13的对话框,选择一个数据库(例如MyApp),双击它或按Open按钮一打开该数据库;一个项目Project是一组相关的文档或者是一个文件的集合,VSS允许你以任何的层次结构来存贮和组织你的项目。在VSS数据库中,你可以创建一个或者多个项目。点击菜单File中的命令CreateProject...,创建一个项目,例如MyProject,如图14所示;创建完项目MyProject后,需要向MyProject中添加文件,点击File中AddFiles命令,将跳出对话框,选择相应文件或目录,点击Add按钮,将它们添加到MyProject中去,如图15所示。
VSS服务器的配置到此基本上已经完成了,创建了数据库和项目,并为它们建立了相应的用户,这样用户在客户端的VC等集成开发环境中就可以直接登录到VSS服务器上,进行在VSS控制管理下的开发工作。
七、在客户端的VC中使用SourceCodeControl
当VSS服务器端的安装配置工作全部完成,并在客户端也完成了VSS的安装,这样就可启用VSS来管理控制整个开发小组的源代码和文档的版本管理。本节我们以应用比较广泛的VC++6.0为例来说明如何坐在客户端运用VSS,以实现所有的开发工作均处于VSS的有效的控制管理之下。
启动MicrosoftVisualC++6.0,在VC的集成开发环境中,点击File菜单的OpenWorkspace命令,跳出的对话框如图16所示,与没有安装VSS客户端软件的VC有一个明显的区别:在对话框的底部增加了一项“Openaprojectfromsourcecodecontrolsourcecontrol”。
点击sourcecontrol按钮,将跳出如图17的登录对话框,输入你的用户名和口令,通过Browse...按钮选择你要登录的数据库。选择一个项目Project,在文本区输入它在本地的工作目录,VSS服务器将在该工作目录下拷贝一份源代码以供用户开发调试和修改,如图18所示。其他的操作就如同在本地开发一样,将鼠标移至VC窗口的边框,按右键选上SourceControl,就会出现SourceControl工具条,如图19所示。选择SourceControl工具条中的相应按钮,可以完成诸如获取某项目文件的最新版本,向VSS数据库中添加新文件,将修改后的文件Checkin提交给VSS数据库,查看某个项目文件的历史信息,进行不同版本文件及不同项目之间文件的差异比对,还有共享某个项目或文件。这样操作起来是不是很轻松呢?!