做为一名开发人员,经常碰到的一个问题是,当使用svn签出一份最新代码时,常常不能一次编译经过,致使花费大量时间去解决编译问题,这里碰到的问题通常能够分为三类:html
1. 因为提交代码的开发人员失误,忘记提交本地更改的文件或少提交,特别是croj或sln项目和新添加的文件,由于新添加的文件在svn下默认是?状态的,这一点的话,只能靠开发人员本身细心解决;git
2. 因为引用版本不一致,或版本更新,开发时俩个开发人员的编译调试,甚至本地测试都不会有问题,可是当须要发布测试版本或发布到生产环境时,就会发生版本冲突致使致命bug,也许这个bug仍是一个隐形bug,很难发现或捕获;github
第二点每每是致命的,由于在敏捷中,提倡的是尽早暴露问题并解决,那么有没有一种方法或措施去解决他,或规避这个问题呢?答案显然是确定的,在这里,我介绍一下目前我接触到的俩种版本管理(或者第三方库的管理方案)。web
第一种是使用TortoiseSVN提供的external特性,在这以前先介绍一下,我采起的svn目录结构,以下api
--trunk <--开发主干浏览器
--build <--自动化构建脚本缓存
--documents <--文档服务器
--packages <--nuget包框架
--references <--引用svn
--releases <--release版本
--src <--源码
--test <--测试用例
--XXXXX.sln <-- 解决方案
--branches <--开发分支
--tags <--发布版本
咱们假设A项目是框架的项目,B项目是业务代码,B项目须要引用框架项目的dll,那么,A项目编译完成后,在releases里发布一个1.0.0的版本(最好使用生成事件写XCOPY脚本,这样就不会忘记发版本,或手动去拷贝构建的版本),以下图
那么,在B项目中,咱们打开reference目录,右键,点击属性,打开属性窗体,按以下操做
完成以后,在每次只要更新这个目录,就能及时得获取到最新的引用版本,在项目文件中对该dll进行引用,实际上引用的是相对目录,这样就解决了由于版本或路径不一致致使的问题,预防这些人为的操做,能够极大的节省咱们的开发时间到实际须要解决的问题上,咱们每次签出的版本也能保证能够构建成功,固然,若是大家项目规范的话,最好写上自动构建脚本,另外就是必定必定必定要使用神器(Jinkens),用上它,大家项目组真的能过上快乐和谐幸福的生活。
第二种方法,就是使用微软公开的Nuget工具,构建本地的nuget服务器,这种方式集成好一些,能够定义包对包的依赖,这样的依赖关系就不用使用者再去管理。废话很少说,先搭建nuget服务器,具体能够看 https://www.cnblogs.com/lzrabbit/archive/2012/05/01/2477873.html 这位博主介绍得比较详细。这里说起到的一点是,在版本升级时,好比开始使用的是某个包的1.0.0版本,后来升级到1.1.0版本,后来1.1.0本身从新上传了一遍,可是版本号没有变,须要删除packages包里对应的1.1.0的包,最好把本地缓存也清空一下,不然可能仍是会拉去1.1.0的旧版本。操做方式是,打开VS,选择菜单工具->Nuget 包管理->程序包管理器设置->常规->清空全部Nuget缓存。
下载https://github.com/NuGetPackageExplorer/NuGetPackageExplorer客户端包管理器并安装。
1. 打开NuGet Package Explorer
2. 选择Create a new package
3. 左边是编辑一些属性等,右侧是添加包文件
4.填入基本信息,其中Id实际上是Name,就是咱们在nuget浏览器里看到的名称
5.在左侧点击Edit dependencies,可添加外部依赖,在下载使用时,会自动检测依赖包并下载
6. 在右侧右键,选择菜单Add a Lib Folder,在Lib上右键,选择Add .NET Folder来添加对应框架的版本,而后右键选择咱们须要添加的文件便可
7.完成如下操做后,咱们就能够点击最上面的File菜单,选择Publish,在弹出的窗体,配置刚才搭建的服务器地址PublishUrl,在下面须要填Publish Key,至关于一个密码,这个是在服务器里web.config里配置的,找到节点<add key="apiKey" value="XXXXXXX"/>,将这个value复制过来便可发布
完成以上操做后,咱们就已经搭建完成了咱们的本地nuget服务器了,若是已经在vs中配置好了本地nuget路径,那么咱们就可使用了。
以上主要是对dll发布和引用的管理介绍了我本人在项目中作的最佳实践,后面会专门写一篇文章介绍如何搭建Jinkens并使用Jinkens完成自动化构建和部署的(也能够作自动化测试)。