svn协同开发下的dll版本管理最佳实践
作为一名开发人员,常常碰到的一个问题是,当使用svn签出一份最新代码时,经常不能一次编译通过,导致花费大量时间去解决编译问题,这里碰到的问题一般可以分为三类:
1. 由于提交代码的开发人员失误,忘记提交本地更改的文件或少提交,特别是croj或sln项目和新添加的文件,因为新添加的文件在svn下默认是?状态的,这一点的话,只能靠开发人员自己细心解决;
2. 由于引用版本不一致,或版本更新,开发时俩个开发人员的编译调试,甚至本地测试都不会有问题,但是当需要发布测试版本或发布到生产环境时,就会发生版本冲突导致致命bug,也许这个bug还是一个隐形bug,很难发现或捕获;
第二点往往是致命的,因为在敏捷中,提倡的是尽早暴露问题并解决,那么有没有一种方法或措施去解决他,或规避这个问题呢?答案显然是肯定的,在这里,我介绍一下目前我接触到的俩种版本管理(或者第三方库的管理方案)。
第一种是使用TortoiseSVN提供的external特性,在这之前先介绍一下,我采取的svn目录结构,如下
--trunk <--开发主干
--build <--自动化构建脚本
--documents <--文档
--packages <--nuget包
--references <--引用
--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完成自动化构建和部署的(也可以做自动化测试)。
svn协同开发下的dll版本管理最佳实践的更多相关文章
- 多项目开发下的dll文件管理
阅读目录: DS01:为什么要对生成的dll文件进行管理? DS02:首先介绍以下两个DOS命令 DS03:第一种实现方法(xcopy) DS04:第二种实现方法(attrib) DS05:分享一个有 ...
- SVN版本控制系统最佳实践
第1章SVN介绍及应用场景 1.1什么是SVN(Subversion) Svn(subversion)是近年来崛起非常优秀的版本管理工具,与CVS管理工具一样,SVN是一个跨平台的开源的版本控制系统. ...
- Maven最佳实践:版本管理
什么是版本管理 首先,这里说的版本管理(version management)不是指版本控制(version control),但是本文假设你拥有基本的版本控制的知识,了解subversion的基本用 ...
- npm常用命令学习(npm install -D,semver版本规范, npm进行版本管理的最佳实践用法)
什么是npm npm有两层含义.一层含义是Node的开放式模块登记和管理系统,网址为npmjs.org.另一层含义是Node默认的模块管理器,是一个命令行下的软件,用来安装和管理Node模块. npm ...
- Maven最佳实践:版本管理【转】
什么是版本管理 首先,这里说的版本管理(version management)不是指版本控制(version control),但是本文假设你拥有基本的版本控制的知识,了解subversion的基本用 ...
- paip.svn使用最佳实践
paip.svn使用最佳实践 作者Attilax , EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn.net/attilax 1 ...
- 10年经验17张图带你进入gitflow企业项目代码版本管理的最佳实践
前言 对于项目版本管理,你是否存在这样的痛点:项目分支多而杂不好管理,git log界面commit信息错乱复杂无规范,版本回退不知道选择什么版本合适--. 项目版本管理的最佳实践系列,笔者将以两篇文 ...
- 开涛spring3(7.5) - 对JDBC的支持 之 7.5 集成Spring JDBC及最佳实践
7.5 集成Spring JDBC及最佳实践 大多数情况下Spring JDBC都是与IOC容器一起使用.通过配置方式使用Spring JDBC. 而且大部分时间都是使用JdbcTemplate类(或 ...
- Pipeline流水线设计的最佳实践
谈到到DevOps,持续交付流水线是绕不开的一个话题,相对于其他实践,通过流水线来实现快速高质量的交付价值是相对能快速见效的,特别对于开发测试人员,能够获得实实在在的收益.很多文章介绍流水线,不管是j ...
随机推荐
- c#中的Out, params,ref 细说并沉淀
1. Out,params,ref之前先记录平时用的最多的按值传递参数的情况,当然默认情况下参数传入函数的默认行为也是按值传递的. 1: //默认情况下参数会按照值传递 2: static int a ...
- C#抓取和分析网页的类
抓取和分析网页的类. 主要功能有: Ontology 1.提取网页的纯文本,去所有html标签和javascript代码 2.提取网页的链接,包括href和frame及iframe 3.提取网页的ti ...
- Linux下安装ActiveMQ CPP
ActiveMQ CPP ActiveMQ CPP是用C++语言访问ActiveMQ的客户端开发库,也称cms(cpp message service),安装cms开发库需要先安装一些基础库. 如下: ...
- 【游戏开发】Excel表格批量转换成CSV的小工具
一.前言 在工作的过程中,我们有时可能会面临将Excel表格转换成CSV格式文件的需求.这尤其在游戏开发中体现的最为明显,策划的数据文档大多是一些Excel表格,且不说这些表格在游戏中读取的速度,但就 ...
- 69、django之Form组件
本篇导航: 小试牛刀 Form类 常用选择插件 自定义验证规则 初始化数据 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次 ...
- 【Java框架型项目从入门到装逼】第一节 - Spring框架 IOC的丧心病狂解说
大家好,好久不见,今天我们来一起学习一下关于Spring框架的IOC技术. 控制反转--Spring通过一种称作控制反转(IoC)的技术促进了松耦合.当应用了IoC,一个对象依赖的其它对象会通过被动的 ...
- 从vultr购买到搭ss看世界
title: 从Vultr购买到搭ss看世界 date: 2017-11-19 12:28:38 categories: 技术 tags: top: 800 password: 写在前面 服务器提 ...
- 对java泛型的理解
正确的应用java泛型的特性可以更好的实现编程的开闭原则(对扩展开放,对修改关闭),这得益于java泛型提供的在程序运行时获取对象声明类型的特性. 静态语言的特性是在程序编译前进行声明,这样程序在编译 ...
- Python网络编程篇之select和epoll
1. select 原理 在多路复⽤的模型中, ⽐较常⽤的有select模型和epoll模型. 这两个都是系统接⼝, 由操作系统提供. 当然, Python的select模块进⾏了更⾼级的封装. ⽹络 ...
- (ajax)——jquery用法
例子:/* ajax获得状态 */ 点击事件 $("#findBycname").click(function(){ var company = ...