《协同开发与cvs的使用.ppt》由会员分享,可在线阅读,更多相关《协同开发与cvs的使用.ppt(52页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、协同开发与协同开发与cvs的使用的使用(1)李鑫 北京工业大学放飞技术网今天将要介绍的主要内容今天将要介绍的主要内容n n版本控制的重要意义n n并行开发中的注意事项和编码规则n n如何支持每日构建(Nightly Build)n ncvs(命令行)和WinCVS(GUI)工具的使用n n如何看cvsweb协同开发面临的问题协同开发面临的问题n n代码同步和集成困难n n连调必须在所有代码被更新、并且能够正常编译的情况下才能进行,传统上,这一过程被安排在编码过程之后n n难以预期模块间的相互影响,这将为整个系统的集成造成困难n n难以评估每个人的工作量,这会打击项目参与者的积极性高质量的编码过
2、程希望的条件高质量的编码过程希望的条件n n问题尽早暴露出来并被修正n n代码符合统一的规范n n在团队范围内共享同一份统一的代码库n n明确责任和奖惩版本控制系统的主要功能版本控制系统的主要功能n n保存项目文件的任何版本,并允许回退先前的任何版本n n比较不同版本之间的差异(diff)n n允许为文件创建不同的开发分支,以支持不同项目的特定需要n n合并不同开发者的修改(重要!)典型的单机版本控制系统是rcs(Revision Control System)。cvs(并行版本控制系统并行版本控制系统)n n可以在单机运行,提供一般的版本控制系统的功能,供个人开发使用n n可以在网络上运行,
3、允许多人协同开发n n开放源代码,可以被容易地定制n n成熟。cvs被全世界的绝大多数开放源代码项目使用,同时也包括相当多的非开放原代码软件项目。cvs(Concurrent Version System)由rcs发展而来。cvs重要的基本概念重要的基本概念n nRepository(代码库):项目文件的所有历史都被保存在代码库中n nCVSROOT变量变量:cvs系统根目录的位置,后面将会介绍n ncheckin/commit(提交):将文件的新的修改送入代码库的过程n ncheckout/update:从代码库中取出某一特定版本的功能编码规范编码规范通用规范n n文件头部的注释说明文件的用
4、途、最初的作者、版权等信息,非常重要的,一个$Header$符,或者,经过定制的符号(如:$Frontfree$,这个符号最终将被替换为包括n n良好的缩进(根据语言不同有所差异)n n避免行尾空格C#中的编码规范中的编码规范(断行断行)断行希望放在:n n逗号后面n n运算符后面,如果可能,尽可能在高级运算符后面n n断行之后的行的应缩进到断开的表达式开始的位置C#中断行的举例中断行的举例好的风格好的风格longMethodCall(expr1,expr2,longMethodCall(expr1,expr2,expr3,expr4,expr5);expr3,expr4,expr5);nVa
5、r=a*b/(c-g+f)+nVar=a*b/(c-g+f)+4*z;4*z;不好的风格不好的风格nVar=a*b/(c-g+nVar=a*b/(c-g+f)+4*z;f)+4*z;C#中的缩进规范中的缩进规范n n使用Tab作为缩进符n n在开发团队中统一Tab宽度。通常,设置为4为宜;对于代码层次数较多的代码,建议设置为2,但具体空多少,应该在编码过程之前确定下来注释规范注释规范n n一般注释/*第一行*第二行*/n n重要注释(单行)/*非常重要的注释*/注释规范注释规范n n单行注释/单行注释n n文档注释/类定义./等等。常用的还有,以及。变量定义变量定义n n一般情况下,每行只定义
6、一个变量,例如:int level;/indentation levelint size;/size of tablen n而避免:int a,b;/What is a?What does b stand for?int a,b;/What is a?What does b stand for?n n尽可能在定义时初始化变量接口定义接口定义n n标识符及其后面的(之间,不空格。例如:public MySample(int myInt)n n类和函数的定义,单起一行,例如:public MySample(int myInt)=myInt;If-else、for/foreach、while/whi
7、le-do、switch、try/cache语句语句n nifif、elseelse等等,等等,与条件的与条件的)写在同一行,中间空写在同一行,中间空一格一格if(condition)if(condition)DoSomething();DoSomething();.else if(condition)else if(condition)DoSomethingOther();DoSomethingOther();.else else DoSomethingOtherAgain();DoSomethingOtherAgain();.If-else、for/foreach、while/while-
8、do、switch、try/catch语句语句n n基本上和这些语句的条件放在同一行n ncase 条件:单放一行n n冒号(:)后面的行缩进一级善用空行和空格善用空行和空格n n使用空行分割不同的小型逻辑单元,例如,分割两组完成不同任务的程序段,分隔方法、属性、类的定义,等等n n逗号后面用空格分开,例如:(a,b,c)不要写成(a,b,c)n n类型、标识符、数值对齐命名规则命名规则n n开发团队必须指定统一的命名习惯,Windows上的开发,通常会使用Hungarian Notation(匈牙利命名,微软公司推荐的命名习惯),而Unix上的命名习惯与此有很大的不同。但在同一个项目中,通常
9、只允许一种开发习惯。n n命名规则请参考具体的项目组规定。cvs的使用的使用Windows上的工具n nWinCVS(图形界面)n ncvs for Windows(命令行界面)集成环境n nIgloo(Visual 集成插件)n nJava CVS(JBuilder等工具内建cvs支持)Unix环境n ncvs善用空行和空格善用空行和空格n nstringstring namename=Mr.Ed;=Mr.Ed;n nintintmyValuemyValue=5;=5;n nTestTestaTestaTest=;=;作为一般开发者的准备作为一般开发者的准备n n向你的cvs reposit
10、ory meister(cvs代码库管理员)询问CVSROOT环境变量的设置、获得访问权限,等等n n安装cvs客户端软件(普通的开发者只需要IDE的插件就可以了,但WinCVS或命令行的cvs能够提供更大的灵活性)n n准备一个工作目录,并作一次cvs checkout工作准备举例工作准备举例n n设置CVSROOT环境变量n n创建一个空的目录,作为“工作目录”:mkdir D:WorkdirMyProjectn n执行checkout操作:cvs co 模块名称*如果希望checkout整个repository,可以在模块名称处填写.WinCVS中配置中配置cvsrootCVSROOT各
11、个部分的意义各个部分的意义:pserver:/pcvspserver-以口令验证身份的服务器delphij-用户名-cvs服务器/pcvs-Repository位置上述信息可以从服务器管理员那里获得。pserver是比较常用的验证方式本地本地CVSROOT举例举例n n:local:D:pcvs:local:-本地cvs repositoryD:pcvs-路径(需要首先执行cvs init初始化)CVSROOT与本地副本与本地副本n n在Windows上,本地的工作副本中包含了描述CVSROOT的一些数据,如服务器、用户口令,等等。n n对于每一份工作副本,只需要在最开始checkout的时候
12、设置一次CVSROOT,之后的cvs操作都会依据这些描述性数据自动找到服务器、用户,等等。检出检出(checkout)和提交和提交(commit)代代码码n n检出代码cvs co.(检出当前目录对应的所有代码)n n更新代码cvs up.(更新当前目录对应的所有代码)n n提交代码cvs ci.(将所有本地修改过的代码提交到代码库)commit logn n在提交代码时,cvs系统会要求提供发生这项修改的原因。n n许多管理员会配置cvs使得这些日志通过邮件发给所有相关的人员。这类邮件被称为commit mailn nlog可以通过cvs查阅,也可以通过cvsweb之类的工具来察看cvswe
13、b有效的有效的cvs代码察看工具代码察看工具n n允许以Web方式察看文件的任意版本n n允许察看不同版本之间的diff(差异)n n允许察看代码被引入的时间、修改发生的原因,等等n n允许按照不同的版本分支察看代码*以下演示cvsweb的一部分界面(目录、某个文件的版本、diff)添加和删除文件添加和删除文件n n添加文件cvs add 文件名n n删除文件cvs remove 文件名*在commit之前,这些操作并不生效;即使文件已经被删除,仍然可以得到它们先前的版本演示演示WinCVS的操作的操作n n以下我将演示WinCVS的操作,其中包括设置CVSROOT、初始化本地Reposito
14、ry、checkout、commit、add、remove、update、和冲突处理。提问时间提问时间问题:如何移动文件?问题:如何移动文件?n ncvs保存每个文件的历史(每次commit),这些历史对于软件开发团队中的开发人员不断提高具有非常重要的意义n ncvs本身不提供移动文件的机制,简单地使用add+remove,将会导致未来难以追踪文件的修改解决方案:解决方案:repo-copyn n开发者向开发者向cvs repository meister(cvs repository meister(代码库管理员代码库管理员)提提出出repo-copyrepo-copy的申请,包括涉及的文件
15、、移动的原的申请,包括涉及的文件、移动的原因,等等因,等等n nmeistermeister将对应的将对应的rcsrcs文件复制到目的位置文件复制到目的位置n n开发者开发者checkoutcheckout代码库,此时,本地工作副本的代码库,此时,本地工作副本的“目的位置目的位置”将会出现那些将被移动的文件将会出现那些将被移动的文件n n开发者使用开发者使用cvs removecvs remove删除原来位置的文件,可选删除原来位置的文件,可选地,在新的位置做一次地,在新的位置做一次force commitforce commit,说明文件的,说明文件的移动移动传统开发中的编码过程传统开发中的
16、编码过程n n开始模块开发n n编码过程n n本地调试n n测试、连调、修正问题后三步将反复地迭代,直到最终满意使用版本控制系统之后的编码过程使用版本控制系统之后的编码过程n n每天开始工作之前,checkout一份代码n n修改并进行初步的测试之后,commit代码,并且,如果必要,解决代码修正的冲突n n简单地说,开始修改之前作checkout,确认修改基本无误之后commit*上述过程是乐观并发的,尽管cvs支持对文件上锁或配置权限上述方法的好处上述方法的好处n n所有开发者使用同一份代码库,本地修改与别人的修改及时地反映在代码库中,意味着连调能够尽早地开始。n n改善开发者之间的沟通。
17、修改了什么、为什么修改都在repository中反映,如果代码库管理员进行了适当的配置,这些记录(说明部分,以及对于修改的量化描述)还能够通过邮件直接发送到所有开发者上述方法的好处上述方法的好处n n实际的软件工程中,两个人恰好修改同一代码的实际的软件工程中,两个人恰好修改同一代码的同一部分,并且有不同的想法的情况很少,因此,同一部分,并且有不同的想法的情况很少,因此,乐观并发保证了他们能够同时修改同一文件的不乐观并发保证了他们能够同时修改同一文件的不同部分,而一旦发生冲突同部分,而一旦发生冲突(同时修改同一文件的同同时修改同一文件的同一部分,并且修改不同一部分,并且修改不同),后一个,后一个
18、commitcommit的开发者的开发者负责合并修改。负责合并修改。n n分享同一份代码库意味着能够实施每日构建,而分享同一份代码库意味着能够实施每日构建,而这对于提高生产效率,使开发更具可控性具有非这对于提高生产效率,使开发更具可控性具有非常重要的意义。常重要的意义。每日构建每日构建(Daily Build/Nightly Build)n n依赖版本控制系统,测试工程师每天(是的,每天)从代码库中checkout出一份最新的快照版本n n测试工程师以这份源代码构建整个系统n n测试小组以这份编译版本(binary)进行测试每日构建的测试内容每日构建的测试内容n n确保每日构建时的快照能够正确
19、编译(可能需要适当回滚某些文件版本)n n按照详细设计检查当天提交的代码是否符合详细设计(单元测试)n n其他适应性测试和代码复审n n将这些信息反馈给编码员,并要求他们解决支持每日构建需要的额外努力支持每日构建需要的额外努力n n保证commit的代码至少通过了本地的编译和简单的运行测试(对于提交了由于代码本身原因造成无法编译的代码的开发者,一旦影响每日构建过程,通常会要求他们立刻解决)n n进行功能性修改时,尽可能作到每修改一项功能就commit一次,这将减少万一出现问题时的改正难度每日构建中的代码复审每日构建中的代码复审n n此时的代码复审主要是对于代码是否符合设计要求,进行的修改是否可
20、能造成对于其他模块的不利影响(特别是潜在的影响)n n代码复审员必须是拥有丰富经验的程序设计师,并且,对于整个系统的架构有非常深入的了解n n许多公司选择把代码复审中发现的问题私下地发给相关开发者每日构建与传统方式的比较每日构建与传统方式的比较n n每日构建方式中,几每日构建方式中,几乎每天都有一份可以乎每天都有一份可以正确编译的快照正确编译的快照n n开发团队中的任何人开发团队中的任何人都可以进行每日构建,都可以进行每日构建,而测试工程师对完成而测试工程师对完成每日构建之后的测试每日构建之后的测试负责。负责。n n传统方式中,测试构传统方式中,测试构建过程被放在开发接建过程被放在开发接近结束
21、的时候近结束的时候n n通常是测试工程师完通常是测试工程师完成测试构建,并分发成测试构建,并分发给测试组。团队中的给测试组。团队中的其他人可能并不了解其他人可能并不了解构建的细节构建的细节每日构建与传统方式的比较每日构建与传统方式的比较n n测试过程渗透到开发测试过程渗透到开发过程的每一步过程的每一步n n每日构建最终在工程每日构建最终在工程交付前,很难再出现交付前,很难再出现严重的连调问题严重的连调问题n n不容易发生工期延误不容易发生工期延误n n测试过程集中于开发测试过程集中于开发的最后阶段的最后阶段n n传统方式中,交付前传统方式中,交付前测试往往引起较大的测试往往引起较大的震荡,如连
22、调失败等震荡,如连调失败等等等n n容易发生工期延误容易发生工期延误总结总结引入版本控制(我们本次演示的是cvs,但主要的思想适用于任何其他的版本控制系统)可以改善软件工程中的编码和测试过程,主要的好处体现在:n n为开发者之间的代码同步提供了有效的途径,通过保存代码的不同版本,开发团队能够保留过去的经验,并据此对开发过程进行改进总结总结n n每个人的工作在版本控制系统中得到了有效的体现,从而,有利于明确奖惩,从而激发开发团队的工作积极性。n n通过commit mail,工作人员之间能够更好的交流想法,而且由于每一个修正都必须写commit log,有助于养成严谨的开发习惯。n n每日构建使
23、得工程的进度更加容易把握,从而有助于更好地管理项目工作。总结总结n n每日构建使得测试被渗透到开发的整个过程中,这有助于尽早发现和解决问题,避免工期延误n n代码库中保存了开发的整个历史,万一发生版权争议这样的问题,代码库能够有效地表现代码的开发过程,做为开发原创性的重要证据谢谢大家谢谢大家参考文献参考文献n n车东,cvs命令速查手册,n n如何参与到Mozilla工程中来:n nMurray Stokely,交付工程:http:/参考文献参考文献n n李鑫,协作开发中的质量保证技术并行版本控制、每日构建和交付工程n nCVS 并行版本控制系统http:/版权声明版权声明版权所有版权所有 2
24、003 2003 李鑫李鑫 ,保留所有权力。,保留所有权力。在满足下列条件的前提下,允许重新分发修改过或未经修改的,以源代码或已编在满足下列条件的前提下,允许重新分发修改过或未经修改的,以源代码或已编译形式存在的本软件:译形式存在的本软件:1.1.以源代码形式的发布必须保留未经修改的上述版权声明、本许可条件,以及以源代码形式的发布必须保留未经修改的上述版权声明、本许可条件,以及其后的不承诺条款。其后的不承诺条款。2.2.以已编译形式的发布必须在发布版本的文档和以已编译形式的发布必须在发布版本的文档和/或其他资料上重述上述版权声或其他资料上重述上述版权声明、本许可条件,以及其后的不承诺条款。明、
25、本许可条件,以及其后的不承诺条款。此软件由其作者以此软件由其作者以“即此即此”方式提供。无论明示的或暗示的,包括但不必限于间方式提供。无论明示的或暗示的,包括但不必限于间接的关于基于某种目的的适销性、实用性,在此皆明示不予保证。在任何情接的关于基于某种目的的适销性、实用性,在此皆明示不予保证。在任何情况下,作者皆不对由于使用此软件造成的,直接、间接、连带、特别、惩戒况下,作者皆不对由于使用此软件造成的,直接、间接、连带、特别、惩戒或因此而来造成的损害或因此而来造成的损害(包括,但不必限于获得替代品及服务,无法使用,丢包括,但不必限于获得替代品及服务,无法使用,丢失数据,损失盈利或业务中断失数据,损失盈利或业务中断),无论此类损害是如何造成的,基于何种责任,无论此类损害是如何造成的,基于何种责任推断,是否属于合同范畴,严格赔偿责任或民事侵权行为推断,是否属于合同范畴,严格赔偿责任或民事侵权行为(包括疏忽和其他原包括疏忽和其他原因因)承担任何责任,即使预先被告知此类损害可能发生。承担任何责任,即使预先被告知此类损害可能发生。