SCM代码管理和Build构建

SCM代码管理和Build构建_第1张图片
image.png

源代码管理工具的起源
为什么会出现源代码管理工具?
为了解决在软件开发过程中,由源代码引发的各种蛋疼、繁琐的问题

源代码会引发哪些问题?
无法后悔:做错了一个操作后,没有后悔药可以吃
版本备份:费空间、费时间
版本混乱:因版本备份过多造成混乱,难于找回正确的想要的版本
代码冲突:多人操作同一个文件(团队开发中的常见问题)
权限控制:无法对源代码进行精确的权限控制
追究责任:出现了严重的BUG,无法得知是谁干的,容易耍赖
源代码管理工具就是为了解决上述问题而生的!此乃软件开发的一大福音!

源代码管理工具的作用
概括一下,源代码管理工具的作用是
能追踪一个项目从诞生一直到定案的过程
记录一个项目的所有内容变化
方便地查阅特定版本的修订情况
… …

现在开始使用源代码管理工具

如果是团队开发,使用源代码管理工具是强制性的!
如果是单人开发,也强烈建议现在就开始使用源代码管理工具

使用源代码管理工具
由于使用简单,不会增加工作量
不会对现有工作造成任何损害(坏的影响)
是一位合格的软件开发人员必须掌握的技术

常见的源代码管理工具
CVS
开启版本控制之门
1990年诞生,“远古时代”的主流源代码管理工具

SVN
全称是Subversion,集中式版本控制之王者
是CVS的接班人,速度比CVS快,功能比CVS多且强大
在国内使用率非常高(70%~90%)

GIT
一款伟大的分布式源代码管理工具
目前被越来越多的开源项目使用
不过在国内企业尚未大范围普及
有开源社区github oschina都是用GIT管理源代码

1.SCM代码管理和Build构建######################################
http://svnbook.red-bean.com/
Subversion有一个很标准的目录结构,是这样的。比如项目是proj,svn地址为svn://proj/,那么标准的svn布局是
svn://proj/|+-trunk+-branches+-tags
这是一个标准的布局,trunk为主开发目录,branches为分支开发目录,tags为tag存档目录(不允许修改)。但是具体这几个目录应该如何使用,svn并没有明确的规范,更多的还是用户自己的习惯。对于这几个开发目录,一般的使用方法有两种。我更多的是从软件产品的角度出发(比如freebsd),因为互联网的开发模式是完全不一样的。第一种方法,使用trunk作为主要的开发目录。一般的,我们的所有的开发都是基于trunk进行开发,当一个版本/release开发告一段落(开发、测试、文档、制作安装程序、打包等)结束后,代码处于冻结状态(人为规定,可以通过hook来进行管理)。此时应该基于当前冻结的代码库,打tag。当下一个版本/阶段的开发任务开始,继续在trunk进行开发。此时,如果发现了上一个已发行版本(Released Version)有一些bug,或者一些很急迫的功能要求,而正在开发的版本(Developing Version)无法满足时间要求,这时候就需要在上一个版本上进行修改了。应该基于发行版对应的tag,做相应的分支(branch)进行开发。例如,刚刚发布1.0,正在开发2.0,此时要在1.0的基础上进行bug修正。按照时间的顺序
1.0开发完毕,代码冻结
基于已经冻结的trunk,为release1.0打tag此时的目录结构为svn://proj/ +trunk/ (freeze) +branches/ +tags/ +tag_release_1.0 (copy from trunk)
2.0开始开发,trunk此时为2.0的开发版
发现1.0有bug,需要修改,基于1.0的tag做branch此时的目录结构为svn://proj/ +trunk/ ( dev 2.0 ) +branches/ +dev_1.0_bugfix (copy from tag/release_1.0) +tags/ +release_1.0 (copy from trunk)
在1.0 bugfix branch进行1.0 bugfix开发,在trunk进行2.0开发
在1.0 bugfix 完成之后,基于dev_1.0_bugfix的branch做release等
根据需要选择性的把dev_1.0_bugfix这个分支merge回trunk(什么时候进行这步操作,要根据具体情况)

这是一种很标准的开发模式,很多的公司都是采用这种模式进行开发的。trunk永远是开发的主要目录。
第二种方法,在每一个release的branch中进行各自的开发,trunk只做发布使用。这种开发模式当中,trunk是不承担具体开发任务的,一个版本/阶段的开发任务在开始的时候,根据已经release的版本做新的开发分支,并且基于这个分支进行开发。还是举上面的例子,这里面的时序关系是。
1.0开发,做dev1.0的branch此时的目录结构svn://proj/ +trunk/ (不担负开发任务 ) +branches/ +dev_1.0 (copy from trunk) +tags/
1.0开发完成,merge dev1.0到trunk此时的目录结构svn://proj/ +trunk/ (merge from branch dev_1.0) +branches/ +dev_1.0 (开发任务结束,freeze) +tags/
根据trunk做1.0的tag此时的目录结构svn://proj/ +trunk/ (merge from branch dev_1.0) +branches/ +dev_1.0 (开发任务结束,freeze) +tags/ +tag_release_1.0 (copy from trunk)
1.0开发,做dev2.0分支此时的目录结构svn://proj/ +trunk/ +branches/ +dev_1.0 (开发任务结束,freeze) +dev_2.0 (进行2.0开发) +tags/ +tag_release_1.0 (copy from trunk)
1.0有bug,直接在dev1.0的分支上修复此时的目录结构svn://proj/ +trunk/ +branches/ +dev_1.0 (1.0bugfix) +dev_2.0 (进行2.0开发) +tags/ +tag_release_1.0 (copy from trunk)
选择性的进行代码merge

这其实是一种分散式的开发,当各个部分相对独立一些(功能性的),可以开多个dev的分支进行开发,这样各人/组都不会相互影响。比如dev_2.0_search和dev_2.0_cache等。但是这样merge起来就是一个很痛苦的事情。这里要注意一下的,第六步进行选择性的merge,是可以当2.0开发结束后一起把dev_1.0(bugfix用)和dev_2.0(新版本开发用)merge回trunk。或者先把dev_1.0 merge到dev_2.0,进行测试等之后再merge回trunk。这两种方法各有利弊,第一种方法是可以得到一个比较纯的dev_2.0的开发分支,而第二种方法则更加的保险,因为要测试嘛。以上呢,就是我说的两种开发模式了,具体哪种好,并没有定论。这里大致的说一下各自的优缺点第一种开发模式(trunk进行主要开发,集中式):优点:管理简单缺点:当开发的模块比较多,开发人数/小团队比较多的时候,很容易产生冲突而影响对方的开发。因为所有的改动都有可能触碰对方的改动第二种开发模式(分支进行主要开发,分散式):优点:各自开发独立,不容易相互影响。缺点:管理复杂,merge的时候很麻烦,容易死人
####################################################################
2.Build构建######################################################
Nodejs https://nodejs.org/en/
reactjs https://facebook.github.io/react/
Webpack http://www.tuicool.com/articles/BrAVv2y http://www.tuicool.com/articles/qUjE7rj
Babel http://babeljs.io/
519 mvn help:describe -Dplugin=org.apache.maven.plugins:maven-compiler-plugin520 mvn clean install -U521 cat /etc/profile522 cat /etc/rc.d/init.d/jenkins523 clear524 node -v525 npm install -g cnpm --registry=https://registry.npm.taobao.org526 npm list -g --depth 0527 clear528 npm list -g --depth 0529 cnpm install -g express530 cnpm install -g mocha531 cnpm install -g babel-cli532 cnpm install -g webpack533 npm list -g --depth 0


#############################mvn commands###################################
cd D:_git\jw-source\jw-basecall mvn cleancall mvn install -DskipTests
cd D:_git\jw-source\jw-hms-pf-001001call mvn cleancall mvn install -DskipTests
cd D:_git\jw-source\hms-webcall mvn cleancall mvn install -DskipTests


打包:mvn package编译:mvn compile编译测试程序:mvn test-compile清空:mvn clean运行测试:mvn test生成站点目录: mvn site生成站点目录并发布:mvn site-deploy安装当前工程的输出文件到本地仓库: mvn install
############################################################################
maven常用命令介绍
这里主要是在eclipse中使用maven,因此只使用到了一部分命令,整理下来方便以后查阅。
生成清除Eclipse项目结构:mvn eclipse:eclipsemvn eclipse:clean
清理(删除target目录下编译内容)mvn clean
仅打包Web页面文件mvn war:exploded
编译项目mvn compile
打包发布mvn package
打包时跳过测试mvn package -Dmaven.test.skip=ture

Maven用了很久了,命令一直记不住,其实想想就那个几个常用的,今天写下来,帮着记忆吧
创建一个简单的Java工程:mvn archetype:create -DgroupId=com.mycompany.example -DartifactId=Example
创 建一个java的web工程:mvn archetype:create -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DgroupId=com.mycompany.app -DartifactId=my-webapp
打包:mvn package
编译:mvn compile
编译测试程序:mvn test-compile
清空:mvn clean
运行测试:mvn test
生成站点目录: mvn site
生成站点目录并发布:mvn site-deploy
安装当前工程的输出文件到本地仓库: mvn install
安 装指定文件到本地仓库:mvn install:install-file -DgroupId= -DartifactId= -Dversion=1.0.0 -Dpackaging=jar -Dfile=
查看实际pom信息: mvn help:effective-pom
分析项目的依赖信息:mvn dependency:analyze 或 mvn dependency:tree
跳过测试运行maven任务: mvn -Dmaven.test.skip=true XXX
生成eclipse项目文件: mvn eclipse:eclipse
查看帮助信息:mvn help:help 或 mvn help:help -Ddetail=true
查看插件的帮助信息:mvn :help,比如:mvn dependency:help 或 mvn ant:help 等等。

常用命令

  1. 创建Maven的普通java项目: mvn archetype:create -DgroupId=packageName -DartifactId=projectName 2. 创建Maven的Web项目: mvn archetype:create -DgroupId=packageName -DartifactId=webappName -DarchetypeArtifactId=maven-archetype-webapp 3. 编译源代码: mvn compile 4. 编译测试代码:mvn test-compile 5. 运行测试:mvn test 6. 产生site:mvn site 7. 打包:mvn package 8. 在本地Repository中安装jar:mvn install 9. 清除产生的项目:mvn clean 10. 生成eclipse项目:mvn eclipse:eclipse 11. 生成idea项目:mvn idea:idea 12. 组合使用goal命令,如只打包不测试:mvn -Dtest package 13. 编译测试的内容:mvn test-compile 14. 只打jar包: mvn jar:jar 15. 只测试而不编译,也不测试编译:mvn test -skipping compile -skipping test-compile ( -skipping 的灵活运用,当然也可以用于其他组合命令) 16. 清除eclipse的一些系统设置:mvn eclipse:clean

你可能感兴趣的:(SCM代码管理和Build构建)