看到CoolBug在研究有关NAnt的东东,感觉非常的有趣,也来聊聊这个问题,聊聊我喜欢的MSBuild,关于MSBuild 我想JJX比我更有发言权,很早的时候他的WebLog就有记载MSBuild

给我印象最深刻和让我觉得最有用的文章是Overview of MSBuild, Part 3: What Is the Limit to Extensibility? 很早时我们会因为一个人喜欢一个城市,因为喜欢某种黑客风格而喜欢一种技术,MSBuild的扩展性让我更喜欢它,有时我想这是一个工作流的引擎,是一个只要你愿意就可以将功能往上挂的框架,是一个非常Open和具有灵性的东东

CoolBug的研究也许源于这篇文章

Using Open Source .NET Tools for Sophisticated Builds - By Aaron Junod

我想每个项目都会建立一个软件开发的Process,而且很多时候我认为一个好的开发流程非常非常的重要,非常有讽刺的是以前我在奔步(一家立志过CMM4 ,CMM5的软件公司)的时候,一直感觉软件开发流程、文档和开发之间的重叠,因为太多的文档、太多的流程和太紧的项目交付时间,所以很容易失去重心,特别是开发人员,最后发现他们每天要做许多许多的工作,而且没有明确的Process的感觉,但每个人对Process的概念都非常的明确,当然这没有什么不好,唯一的问题,是一个执行和实施的效果问题,我记得那时候我们的项目交付时间往往总是被拖后。

成长总是比较烦恼和让人变得世俗起来,之后的项目流程也是如此,项目或产品的流程倾向于一种彻底的实用主义和程序化。希望这个流程能根据不同的项目组很快的搭建和实施,并取得不错的效果,制定的流程往往不仅为了这个项目而且还为了可以向其他的项目组进行复制;制定的开发流程也试着加入一些新的特性,比如XP的单元测试、XP开发中的交付计划,非常传统的Code Review等等。

总之,定义什么是一个我们需要的开发流程,我总结了下面几点:

1.  容易理解、容易使用、容易实施、很快可以收到实效

2.  数字特性,流程的许多地方是数量化的,可以进行查询、评估、检查、追溯、对比和反馈。

3.  灵活和可以变化的,流程中有永远不变的东西,并具有复制性;也有许多可以针对不同项目组、不同文化、不同产品要求进行变化的模块和特性

4.  个性化。对于一个项目,一个产品组来说,这种流程成为整个产品组或开发组比较个性化的一种共识,开始的时候也许难以适应,但之后你会发现它成为建造整个项目组开发文化的摇篮

5.  学习型。对于开发组和流程中的每个人对于这个流程都有自己的看法和认识,也许不是所有的人都一样,但是有一点非常明显的特性:每个人都知道这个流程不是完美和存在不足,但没有人攻击和挑战它,所有的建议和改变都希望是改进这个流程的不足或是带着通过改变使得这个流程更加完美的意愿来行动的

还好是WebLog,即使偏离了主题还可以继续,继续来讲讲如何用MSBuild 来实现软件开发流程中的DailyBuild 的过程。有关编译有几个不错的选择:NAnt、BuildIt、MSBuild当然还有批处理和其他的一些选择。我来之前,这个项目组是根据Team Development with Visual Studio .NET and Visual SourceSafe中的描述,使用BuildIt作为编译工具,BuildIt也挺好,但是扩展性比较差一些。NAnt应该是一个不错的选项,不过出于喜好,很容易的想到MSBuild,而且花了点时间,找到了一个for FX1.1的版本,这也就意味着不用等到VS2005,我们也不用按照FX2.0了J

好了简单的说一下我们要实现的一个DailyBuild的流程

1.  每天从Source Server(SS)上面获得所有的代码

2.  编译Visual Studio 的Solution

3.  将编译的结果收集到一个临时的Binn目录

4.  切换到VSS发布目录

5.  删除旧的发布文件,将新的编辑结果发布上去并做一个标签

6.  将编译成功的源代码和二进制文件打包备份到网络的另一台机器的backup/yyyy-MMdd-mmss目录

7.  当然如果你愿意还可以让它发一封Email通知你编译成功或失败,失败了最好发个短信给我J

@echo off

SET VSS_SS_DIR=C:/Program Files/VSS/win32

SET MSBUILD_DIR=C:/myProject/DailyBuild/MSBuild

SET NETFRAMEWOR_DIR=%SYSTEMROOT%/Microsoft.NET/Framework/%FRAMEWORK_VERSION%;

SET PATH=%PATH%;%NETFRAMEWOR_DIR%;%VSS_SS_DIR%;%MSBUILD_DIR%

SET BUILD_WORK_DIR=./BuildTempXX

SET BUILD_BIN_DIR=%BUILD_WORK_DIR%/BINN

SET PUBLIC_ASSEMBLY_DIR=%BUILD_WORK_DIR%/PublicAssembly

SET VSS_BIN_DIR=$/SourceCode/Build/Latest

SET VSS_LASTVERSION_DIR=$/Source/Project/XXXXX/LastVersion/binn

SET MSBILD_FILE=DailyBuild.proj

SET VSS_CODE_DIR=C:/WorkDir/DailyBuild/VSS

SET SSDIR=//10.01.10.11/XXXXXXX

SET SSUSER=DailyBuiler

SET SSPWD= DailyBuiler

@echo on

@echo ==========****获得访问权限*******=========

rem 获得访问的权限,访问任意目录 请确认该用户一定可以访问不然会出错

net use //10.01.10.11  xxxx /user:xxxxx

rem 开始从VSS上下载代码

@echo  ========****获得源代码*******========

rem 删除之前的文件

rd /s /q %VSS_CODE_DIR%

md %VSS_CODE_DIR%

rd /s /q %BUILD_WORK_DIR%

MSBuild %MSBILD_FILE% /t:GetSourceCode

rem 增加错误处理

if errorlevel 1 goto ErrHandelMSBuild

md %BUILD_WORK_DIR%

Xcopy %VSS_CODE_DIR% %BUILD_WORK_DIR% /s /e

rem 开始编译项目

@echo =======****开始编译项目文件*******=========

MSBuild %MSBILD_FILE%  /t:Solution

rem 增加错误处理

if errorlevel 1 goto ErrHandelMSBuild

rem 收集编译结果并发布到一个临时的Bin目录

MSBuild %MSBILD_FILE%  /t:CopyToBin

rem 增加错误处理

if errorlevel 1 goto ErrHandelMSBuild

rem 发布编译结果到VSS上

@echo =======****发布编译结果*******=============

@echo off

rem 发布编译好的结果到Build目录,供大家使用

rem 切换到发布目录 $/code/build/latest

SS CP %VSS_BIN_DIR%

rem 设置当前路径

SS workfold %VSS_BIN_DIR% %BUILD_BIN_DIR%

rem 删除之前的文件

SS Destroy  -i-y *.*

rem 加编译的结果到VSS

SS Add %BUILD_BIN_DIR%/*.* -B -D –i-y -C"DailyBuild Add"

rem 加Label

SS LABEL %VSS_BIN_DIR% -L"Last Vesion" -i-y -C"DailyBuilder LABEL"

rem 发布完成后进行整理和备份工作

@echo =======================****进行最后的整理和备份工作*******=================

MSBuild %MSBILD_FILE%  /t:BackupFiles

rem 删除工作目录

rem rd /s /q %BUILD_WORK_DIR%

rem rd /s /q %VSS_CODE_DIR%

@echo =====**** DaildBuild OK!*******=====

MSBuild %MSBILD_FILE%  /t:EMailReportToMe

:ErrHandelMSBuild

ECHO ErrorEvel=%ERRORLEVEL%

rem MSBuild编译出错,表明这次编译不成功,不作处理,要做只做删除目录的处理

MSBuild %MSBILD_FILE%  /t:EMailErrorReportToMe

goto Close

:Close

rem rd /s /q %BUILD_WORK_DIR%

rd /s /q %VSS_CODE_DIR%

goto end

:end

@echo ===========****End*******=========

pause

很长,但非常的简单和实用,我使用了一些批处理,因为这样不用在整段的写MSBuild Task了J 有关MSBuild的使用我们可以不讲,因为JJX的文档足够清楚了,这里有非常关键的一点需要和你分享,这不是MSBuild,是VSS的技巧,这是追求完美的人一定需要的

这个问题在发布的时候,当你的编译都通过了,要发布到VSS目录里的时候,会遇到一个版本覆盖的问题。

VSS 无论Check in还是删除原来的版本都有一个非常有趣的功能,提示不厌其烦的提示你是否同意,SS给也给一个非常无聊的参数-I 意思是忽略,但比较郁闷的是忽略的意思是给系统一个No的回答,那意味着什么?当系统问你是否要删除或覆盖旧的版本时它给了一个No的回答,还好还好,有微软有热情的微软工程师和Google,我们找到了这个技巧,默认它会不厌其烦的给提示一个Yes的回答,当然这是我们想要的

具体你可以查看bat文件和这个链接---VSS的Developer Support Engineer就是牛!

所有MSBuild %MSBILD_FILE%  /t:XXXX的地方,都是写了自定义的Task来实现这个就不细说了。

MSBuild的另外一个好处,就是我上面讲的无限扩展的功能,很快很快我想你可以用MSBuild+NUnit完成一个BVT 的功能。当然如果你觉得Aaron Junod讲的也对,你还可以使用MSBuild+NDoc来完成一个自动文档化的功能,显然我喜欢BVT胜过NDoc,道路很简单,我觉得BVT比NDoc对我们的项目或开发更有用。

编程快乐

posted on 2004-07-26 13:29 ccBoy 阅读(3301) 评论(8)  编辑 收藏 收藏至365Key 所属分类: 安装和部署 、项目开发和流程

评论

# re: 用MSBuild.... DailyBuild和软件开发流程的东东 2004-07-26 13:55 ccBoy

饶恕我,有关VSS的那个链接是我找到正确链接的上一个链接,所以下面这个是描述-I问题的
http://dotnetjunkies.com/Newsgroups/microsoft.public.vstudio.sourcesafe/2004/3/23/78955.aspx

下次更新时一起更正吧

ccBoy

#re: 用MSBuild.... DailyBuild和软件开发流程的东东 2004-07-26 16:21 CoolBug

我也是第一次研究,也看过你指的那网站,不过更多的是看软件自带的DOC文件,其实DOC文件夹里讲的都很详细.

#re: 用MSBuild.... DailyBuild和软件开发流程的东东 2004-07-26 16:24 Michael

I don't use VSS, so correct me if I am wrong. :)
It seems that you delete all the older bin files and only keep the latest one in VSS. I think it will be better to keep all the history, and check in the latest build out as a version. Then label all the source code and bin output. Thus you can get the source code and binary output for every day.

#re: 用MSBuild.... DailyBuild和软件开发流程的东东 2004-07-26 19:12 ccBoy

Thanks Michael,允许我用中文吧:)

Label SouceCode是一个不错的主意,这个下次要进行改进。
至于另外的一个或一些建议,需要考虑,考虑一个更复杂的开发场景
1。假如这个项目比较大,前后台开发的人是截然分开的两拨人,前台或另外的人每天需要最快的拿到编译的结果进行他那一部分的开发。所以我们在VSS上建立一个文件的目录或说项目,这里面放着最新的DLL或编译结果,这个目录不会有CheckIn/CheckOut权限,除了Builder用户所有的人都是只读的.
2.实施中我们是依靠MSBuild 的 /t:BackupFiles 来完成归档,归档的时候,包括昨天的发布结果、今天的编译结果、源代码部分都会按目录和某种规则进行归档和放到指定的地点。
3.如果用VS开发的项目够大,你会被文件引用和项目引用搞得有些神经质,我相信你最后会选取项目引用为主,加文件引用的方式,所以最后你会发现,每个人不是简单的从服务器上Check out/Check in/Get Last这么简单,因为有可能存在极少一部分文件引用(问题是文件引用有可能来自其他的Team或部门,下面我会提到这个问题)
4.DailyBuild的时间,其实前面我省略了关闭VSS Server的代码,在编译期间所有的人是不能访问VSS的,另外我们假设的情况,每天DailyBuild的时间不是一次,只要变更管理流程可以走完,那么DailyBuild编译可能是按需的
5.最后是规模和大小,假设这种状态不是在一个部门,而且是分布式的两幢楼或三幢楼,5、6个Team都在用这样方式进行DailyBuild,并且在最后完成的时候进行发布聚合,这是我遇到的情况:)

VSS不完全是做源代码管理的,源代码管理和备份可能是另外一个部门或是SCM部门来控制,我们是依赖/t:BackupFiles 这个Task将源代码和版本的信息传递到指定的地方和部门,之后的事情由其他的部门来负责搞定,因为整个项目或产品的版本和源代码管理是他们控制的。

至于你是否会考虑尝试一下VSS,那就看你自己了:)
很多时候,当你用惯了,你会喜欢和依赖它。更重要的是从一开始就不要拿它和CVS或同类的其他软件进行比较:) 决不也从不要haha

ccBoy

#re: 用MSBuild.... DailyBuild和软件开发流程的东东 2004-07-26 19:18 ccBoy

http://blog.csdn.net/beegee/archive/2004/07/01/31761.aspx
这里也有一篇用NAnt的.--- 一个轻巧的每日构建解决方案

Hi,Michael 忘了说了我也不喜欢VSS的全部,比如我就不喜欢VSS Shadow Folder功能
占用我的硬盘、可恶的提示,另外我不会把的源代码目录让别人用共享的方式可以进行访问:)

#re: 用MSBuild.... DailyBuild和软件开发流程的东东 2004-07-26 22:36 beegee

ccboy.拜读了!
好文,谢谢!

#re: 用MSBuild.... DailyBuild和软件开发流程的东东 2004-08-01 23:26 JeryCN

MSBuild必须要.NET FRAMEWORK2.0才能用么??

#re: 用MSBuild.... DailyBuild和软件开发流程的东东 2005-08-22 10:57 poethxp

我对ccBoy你的大名比较感兴趣。

# re: 用MSBuild.... DailyBuild和软件开发流程的东东 2004-07-26 13:55 ccBoy

饶恕我,有关VSS的那个链接是我找到正确链接的上一个链接,所以下面这个是描述-I问题的
http://dotnetjunkies.com/Newsgroups/microsoft.public.vstudio.sourcesafe/2004/3/23/78955.aspx

下次更新时一起更正吧

ccBoy

#re: 用MSBuild.... DailyBuild和软件开发流程的东东 2004-07-26 16:21 CoolBug

我也是第一次研究,也看过你指的那网站,不过更多的是看软件自带的DOC文件,其实DOC文件夹里讲的都很详细.

#re: 用MSBuild.... DailyBuild和软件开发流程的东东 2004-07-26 16:24 Michael

I don't use VSS, so correct me if I am wrong. :)
It seems that you delete all the older bin files and only keep the latest one in VSS. I think it will be better to keep all the history, and check in the latest build out as a version. Then label all the source code and bin output. Thus you can get the source code and binary output for every day.

#re: 用MSBuild.... DailyBuild和软件开发流程的东东 2004-07-26 19:12 ccBoy

Thanks Michael,允许我用中文吧:)

Label SouceCode是一个不错的主意,这个下次要进行改进。
至于另外的一个或一些建议,需要考虑,考虑一个更复杂的开发场景
1。假如这个项目比较大,前后台开发的人是截然分开的两拨人,前台或另外的人每天需要最快的拿到编译的结果进行他那一部分的开发。所以我们在VSS上建立一个文件的目录或说项目,这里面放着最新的DLL或编译结果,这个目录不会有CheckIn/CheckOut权限,除了Builder用户所有的人都是只读的.
2.实施中我们是依靠MSBuild 的 /t:BackupFiles 来完成归档,归档的时候,包括昨天的发布结果、今天的编译结果、源代码部分都会按目录和某种规则进行归档和放到指定的地点。
3.如果用VS开发的项目够大,你会被文件引用和项目引用搞得有些神经质,我相信你最后会选取项目引用为主,加文件引用的方式,所以最后你会发现,每个人不是简单的从服务器上Check out/Check in/Get Last这么简单,因为有可能存在极少一部分文件引用(问题是文件引用有可能来自其他的Team或部门,下面我会提到这个问题)
4.DailyBuild的时间,其实前面我省略了关闭VSS Server的代码,在编译期间所有的人是不能访问VSS的,另外我们假设的情况,每天DailyBuild的时间不是一次,只要变更管理流程可以走完,那么DailyBuild编译可能是按需的
5.最后是规模和大小,假设这种状态不是在一个部门,而且是分布式的两幢楼或三幢楼,5、6个Team都在用这样方式进行DailyBuild,并且在最后完成的时候进行发布聚合,这是我遇到的情况:)

VSS不完全是做源代码管理的,源代码管理和备份可能是另外一个部门或是SCM部门来控制,我们是依赖/t:BackupFiles 这个Task将源代码和版本的信息传递到指定的地方和部门,之后的事情由其他的部门来负责搞定,因为整个项目或产品的版本和源代码管理是他们控制的。

至于你是否会考虑尝试一下VSS,那就看你自己了:)
很多时候,当你用惯了,你会喜欢和依赖它。更重要的是从一开始就不要拿它和CVS或同类的其他软件进行比较:) 决不也从不要haha

ccBoy

#re: 用MSBuild.... DailyBuild和软件开发流程的东东 2004-07-26 19:18 ccBoy

http://blog.csdn.net/beegee/archive/2004/07/01/31761.aspx
这里也有一篇用NAnt的.--- 一个轻巧的每日构建解决方案

Hi,Michael 忘了说了我也不喜欢VSS的全部,比如我就不喜欢VSS Shadow Folder功能
占用我的硬盘、可恶的提示,另外我不会把的源代码目录让别人用共享的方式可以进行访问:)

#re: 用MSBuild.... DailyBuild和软件开发流程的东东 2004-07-26 22:36 beegee

ccboy.拜读了!
好文,谢谢!

#re: 用MSBuild.... DailyBuild和软件开发流程的东东 2004-08-01 23:26 JeryCN

MSBuild必须要.NET FRAMEWORK2.0才能用么??

#re: 用MSBuild.... DailyBuild和软件开发流程的东东 2005-08-22 10:57 poethxp

我对ccBoy你的大名比较感兴趣。

TD { FONT-SIZE: 12px } .commentTextBox { FONT-SIZE: 12px } .userData { BEHAVIOR: url(#default#userdata) }

zz:用MSBuild.... DailyBuild和软件开发流程的东东相关推荐

  1. 用MSBuild.... DailyBuild和软件开发流程的东东

    看到CoolBug在研究有关NAnt的东东,感觉非常的有趣,也来聊聊这个问题,聊聊我喜欢的MSBuild,关于MSBuild 我想JJX比我更有发言权,很早的时候他的WebLog就有记载MSBuild ...

  2. 软件开发流程包含哪些内容

    2019独角兽企业重金招聘Python工程师标准>>> 能否开发出一个好的软件,关键是看软件开发前期所做的工作,重点是这个软件有没有一个好的 软件开发流程,因为一个好的软件开发流程关 ...

  3. 软件开发模型_QT开发(二十三)——软件开发流程

    一.软件开发流程简介 软件开发流程是通过一系列步骤保证软件产品的顺利完成,是软件产品在生命周期内的管理学. 软件开发流程的本质是软件开发流程与具体技术无关,是开发团队必须遵守开的规则. 二.常见软件开 ...

  4. (6)Vivado软件开发流程(第2天)

    (6)Vivado软件开发流程(第2天) 1 文章目录 1)文章目录 2)FPGA初级课程介绍 3)FPGA初级课程架构 4)Vivado软件开发流程(第2天) 5)技术交流 6)参考资料 2 FPG ...

  5. (5)ISE软件开发流程(第1天)

    (5)ISE软件开发流程(第1天) 1 文章目录 1)文章目录 2)FPGA初级课程介绍 3)FPGA初级课程架构 4)ISE软件开发流程(第1天) 5)技术交流 6)参考资料 2 FPGA初级课程介 ...

  6. 大智慧 软件 开发语言_智慧工厂培训软件开发流程篇

    为了提高河北钢谷电子商务股份有限公司软件开发的工作效率,明确软件开发过程中相关人员的岗位职责,2020年4月2日下午五点,智慧工厂项目组特开展此次软件开发流程有关培训会议,由纪伟经理担任主讲. 智慧工 ...

  7. 3星|《大产品,小团队》:携程软件开发流程改进的故事

    大产品,小团队:携程敏捷技术与管理转型实战 携程集团创作,作者有产品.开发.测试.PMO等多种角色.有一点比较怪异,每个章节的作者是放在书的最后部分的. 主要内容是携程的软件开发流程改进的故事.携程的 ...

  8. 瑞吉外卖项目(一)软件开发流程设计及环境搭建

    第一章 软件开发整体介绍 软件开发流程 软件开发流程 需求分析:产品原型.需求规格说明书 设计:产品文档,ui界面设计,概要设计,详细设计,数据库设计 编码:项目代码,单元测试 测试:测试用例,测试报 ...

  9. 怎么做软件开发,软件开发流程八个步骤

    软件开发流程是指软件开发设计的一般流程,包括软件的总体结构.模块的组成.功能的设计.程序的编译.调试.联调.测试等过程.主要步骤有:项目分析.确定开发.需求分析.设计.编程.软件测试.软件交付.验收. ...

最新文章

  1. 《几何与代数导引》例1.4——定比分点
  2. SAP RETAIL 特征参数文件(Characteristic Profile) III
  3. VS怎样创建和使用lib文件
  4. 进程用户态 上下文切换需要保存哪些_漫话性能:CPU上下文切换
  5. PCB叠层及相关板材介绍
  6. java--模板方法模式
  7. Android隐藏软键盘收回软键盘
  8. python是面向对象还是过程_python编程:面向对象与过程是什么?
  9. python变量以及类型(含笔记)
  10. django 设置登录成功后的页面
  11. java安卓j建立进程_Android应用进程的创建过程
  12. 支撑千万规模类别分类技术,百度飞桨定义工业级深度学习框架
  13. WEB前端开发规范文档
  14. (二)CXF之用CXF官方工具生成客户端Client
  15. 5.编译并运行erlang程序
  16. 如何设置操作系统处于最佳性能?此方法可以取消系统自带的界面渲染及其它多余的辅助功能.
  17. 基于Easyui框架的datagrid绑定数据,新增,修改,删除方法(一)
  18. matlab 画x a的直线方程式,matlab画如x=a和y=b这种水平线和垂线的命令是什么,谢谢...
  19. flash倒计时制作
  20. python编程就业_python编程语言就业做什么工作的?python就业方向

热门文章

  1. CPU突然飙高系统反应慢,是怎么导致的?有什么办法排查?
  2. vocabularies181126
  3. 【建议收藏】机器学习数据预处理(一)——缺失值处理方法(内附代码)
  4. 光盘里的html播放不了,笔记本电脑放光盘的地方打不开怎么办?
  5. CVA 估值报告写作 01
  6. 一个项目经理对主流项目管理工具的对比:禅道VS华为软件开发云
  7. LTE物理层过程--小区搜网、随机接入、功率控制、测量、数据传输
  8. CRC(循环冗余校验)离线计算
  9. Tensorflow的MNIST
  10. Marshal类的使用