作为一名开发人员,常常碰到的一个问题是,当使用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版本管理最佳实践的更多相关文章

  1. 多项目开发下的dll文件管理

    阅读目录: DS01:为什么要对生成的dll文件进行管理? DS02:首先介绍以下两个DOS命令 DS03:第一种实现方法(xcopy) DS04:第二种实现方法(attrib) DS05:分享一个有 ...

  2. SVN版本控制系统最佳实践

    第1章SVN介绍及应用场景 1.1什么是SVN(Subversion) Svn(subversion)是近年来崛起非常优秀的版本管理工具,与CVS管理工具一样,SVN是一个跨平台的开源的版本控制系统. ...

  3. Maven最佳实践:版本管理

    什么是版本管理 首先,这里说的版本管理(version management)不是指版本控制(version control),但是本文假设你拥有基本的版本控制的知识,了解subversion的基本用 ...

  4. npm常用命令学习(npm install -D,semver版本规范, npm进行版本管理的最佳实践用法)

    什么是npm npm有两层含义.一层含义是Node的开放式模块登记和管理系统,网址为npmjs.org.另一层含义是Node默认的模块管理器,是一个命令行下的软件,用来安装和管理Node模块. npm ...

  5. Maven最佳实践:版本管理【转】

    什么是版本管理 首先,这里说的版本管理(version management)不是指版本控制(version control),但是本文假设你拥有基本的版本控制的知识,了解subversion的基本用 ...

  6. paip.svn使用最佳实践

    paip.svn使用最佳实践 作者Attilax ,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http://blog.csdn.net/attilax 1 ...

  7. 10年经验17张图带你进入gitflow企业项目代码版本管理的最佳实践

    前言 对于项目版本管理,你是否存在这样的痛点:项目分支多而杂不好管理,git log界面commit信息错乱复杂无规范,版本回退不知道选择什么版本合适--. 项目版本管理的最佳实践系列,笔者将以两篇文 ...

  8. 开涛spring3(7.5) - 对JDBC的支持 之 7.5 集成Spring JDBC及最佳实践

    7.5 集成Spring JDBC及最佳实践 大多数情况下Spring JDBC都是与IOC容器一起使用.通过配置方式使用Spring JDBC. 而且大部分时间都是使用JdbcTemplate类(或 ...

  9. Pipeline流水线设计的最佳实践

    谈到到DevOps,持续交付流水线是绕不开的一个话题,相对于其他实践,通过流水线来实现快速高质量的交付价值是相对能快速见效的,特别对于开发测试人员,能够获得实实在在的收益.很多文章介绍流水线,不管是j ...

随机推荐

  1. springMVC+spring+MyBatis(SSM)的简单配置

    SSM(Spring+SpringMVC+MyBatis)框架集由Spring.SpringMVC.MyBatis三个开源框架整合而成,常作为数据源较简单的web项目的框架. 其中: Spring是一 ...

  2. 关于回调(callback)

    如果要理解回调,需要在分同步通信.异步通信的基础上了解 举个通俗的例子: 你打电话问书店老板有没有<JS>这本书,如果是同步通信机制,书店老板会说,你稍等,"我查一下" ...

  3. web离线应用 Web SQL Database

    web sql database 是html5废弃的一个新特性,它提供了基本的关系数据库功能,使用 `SQL` 来操纵客户端数据库的 API,这些 API 是异步的,规范中使用的方言是SQLlite ...

  4. Error when sending message to topic test with key: null, value: 2 bytes with error: (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback)

    windows下使用kafka遇到这个问题: Error when sending message to topic test with key: null, value: 2 bytes with ...

  5. This package contains perl-5.16.3, java8, nifi-1.1.2 on ubuntu:14.04

    [How to build:]cd /home/ops/work/demo/docker/aws/srctouch Dockerfiledocker build -t aws_src_image:v1 ...

  6. 【转】npm包管理器那些事

    原文链接:http://www.cnblogs.com/shuoer/p/7782125.html npm包管理器那些事! 今天和朋友针对npm包全局安装和本地项目安装这个梗展开的激烈的讨论,故此做一 ...

  7. J2SE-包装类

    目录 1 为什么提供包装类? 2 装箱和拆箱 3 包装类的4个特点 4 包装类类型 正文 1 为什么提供包装类? 1) 由于Java的基本数据类型功能简单,不具备面向对象的特性,实际使用时存在很多的不 ...

  8. 初识分布式计算:从MapReduce到Yarn&Fuxi

      这些年,云计算.大数据的发展如火如荼,从早期的以MapReduce为代表的基于文件系统的离线数据计算,到以Spark为代表的内存计算,以及以Storm为代表的实时计算,还有图计算等等.只要数据规模 ...

  9. hdu 1151 Air Raid DAG最小边覆盖 最大二分匹配

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1151 题目大意: 城镇之间互相有边,但都是单向的,并且不会构成环,现在派伞兵降落去遍历城镇,问最少最少 ...

  10. Nodejs学习笔记(十七)--- 浮点运算decimal.js

    目录 前言 JavaScript加减乘除运算 decimal.js加减乘除运算 前言 开发过程中免不了有浮点运算,JavaScript浮点运算的精度问题会带来一些困扰 JavaScript 只有一种数 ...