项目管理实践【五】自动编译和发布网站【Using Visual Studio with Source Control System to build and publish website automatically】

    技术2025-01-17  10

    在上一篇教程项目管理实践【三】每日构建【Daily Build Using CruiseControl.NET and MSBuild】 中,我们讲解了如何使用CCNET+MSBuild来自动编译项目,今天我们讲解一下怎么使用MSBuild+WebDeployment+Robocopy自动编译过和部署ASP.NET网站。 首先安装下面的三个软件:

    1.MSBuild.Community.Tasks下载:http://msbuildtasks.tigris.org/files/documents/3383/28296/MSBuild.Community.Tasks.msi

    源代码:http://msbuildtasks.tigris.org/files/documents/3383/36642/MSBuild.Community.Tasks.v1.2.0.306.zip

     2.WebDeployment下载:

    For VS2005http://download.microsoft.com/download/9/4/9/9496adc4-574e-4043-bb70-bc841e27f13c/WebDeploymentSetup.msi

    For VS2008 [RTW]http://download.microsoft.com/download/9/4/9/9496adc4-574e-4043-bb70-bc841e27f13c/WebDeploymentSetup.msi

     3.Utility Spotlight Robocopy GUI 下载:【下载后,解压后安装,Vista不用安装】http://download.microsoft.com/download/f/d/0/fd05def7-68a1-4f71-8546-25c359cc0842/UtilitySpotlight2006_11.exe

    安装完成后,就开始今天的教程了。

    我们以前面教程中创建的StartKit解决方案为例子,结构如下:

    在上图所示的Web项目StartKit上右键点击,然后点击Add Web Deployment Project…,如下图:

     弹出下面的窗体,分别输入部署项目名称和项目要放置的位置,如下图:

     点击OK按钮后,解决方案的结构如下图:

    今天会讲到下面二个方法,上面的步骤一样,从这里开始,下面的步骤有区别。

    方法一:使用WebDeployment创建虚拟目录

    优点:使用简单

    缺点:功能不够强大,只能部署到虚拟目录

    右键点击部署项目,点击菜单中的Property Pages,如下图:

    在下面的窗体中,点击左侧的Complication,在右侧的Output Folder下的文本框中输入编译后网站文件的输出路径:

     然后,点击左侧的Deploment,在右侧选中Create an IIS virtual directory for the output folder前面的CheckBox,在下面的Virtual directory name下的文本框中输入虚拟目录的名字,Replace the existing virtual directory前面的CheckBox根据实际情况确定是否选中,如下图:

     点击确定按钮,编译部署项目StartKit.csproj_deploy,编译成功后,我们打开IIS,在默认网站下可以看到虚拟目录StartKit。OK,成功了!

    方法二:使用WebDeployment+MSBuild+Robocopy

    优点:功能强大

    缺点:配置有点麻烦

    这个方法不用配置Property Pages,直接右键点击StartKit.csproj_deploy项目文件,在菜单中点击Open Project File打开部署项目文件:

    修改部署项目文件为下面的内容:

     

     

      1  <!-- Microsoft Visual Studio 2008 Web Deployment Project http://go.microsoft.com/fwlink/?LinkID=104956 -->   2    3  < Project  ToolsVersion ="3.5"  DefaultTargets ="Build"  xmlns ="http://schemas.microsoft.com/developer/msbuild/2003" >   4  < PropertyGroup >   5  < Configuration  Condition =" '$(Configuration)' == '' " > Debug </ Configuration >   6  < Platform  Condition =" '$(Platform)' == '' " > AnyCPU </ Platform >   7  < ProductVersion > 9.0.21022 </ ProductVersion >   8  < SchemaVersion > 2.0 </ SchemaVersion >   9  < ProjectGuid > {00000000-0000-0000-0000-000000000000} </ ProjectGuid >  10  < SourceWebPhysicalPath > ../StartKit </ SourceWebPhysicalPath >  11  < SourceWebProject > {96E1A089-3FBB-4909-94F6-172665994449}|StartKit/StartKit.csproj </ SourceWebProject >  12  < SourceWebVirtualPath > /StartKit.csproj </ SourceWebVirtualPath >  13  < TargetFrameworkVersion > v3.5 </ TargetFrameworkVersion >  14  < ProjectName > StartKit </ ProjectName >  15  < Major > 1 </ Major >  16  < Minor > 0 </ Minor >  17  < Revision > 0 </ Revision >  18  < VSSName > ttzhang </ VSSName >  19  < VSSPassword > 123456 </ VSSPassword >  20  < FtpName > anonymous </ FtpName >  21  < FtpPassword > anonymous </ FtpPassword >  22  < SmtpServerName > smtp.163.com </ SmtpServerName >  23  < FromAddress > ttzhang@163.com </ FromAddress >  24  < ToAddress > zttc@163.com </ ToAddress >  25  < MailPassword > testmail </ MailPassword >  26  </ PropertyGroup >  27  < PropertyGroup  Condition =" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' " >  28  < DebugSymbols > true </ DebugSymbols >  29  < OutputPath > ./Debug </ OutputPath >  30  < EnableUpdateable > true </ EnableUpdateable >  31  < UseMerge > true </ UseMerge >  32  < SingleAssemblyName > StartKit_deploy </ SingleAssemblyName >  33  </ PropertyGroup >  34  < PropertyGroup  Condition =" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' " >  35  < DebugSymbols > false </ DebugSymbols >  36  < OutputPath > ./Release </ OutputPath >  37  < EnableUpdateable > true </ EnableUpdateable >  38  < UseMerge > true </ UseMerge >  39  < SingleAssemblyName > StartKit_deploy </ SingleAssemblyName >  40  </ PropertyGroup >  41  < ItemGroup >  42  </ ItemGroup >  43  <!-- 下面的ItemGroup节点可选,这个和项目文件StartKit.csproj中的内容相同 -->  44  < ItemGroup >  45  < ProjectReference  Include ="../BLL/BLL.csproj" >  46  < Project > {73A293A1-CDCC-4919-9B05-BA2531ADDB56} </ Project >  47  < Name > BLL </ Name >  48  </ ProjectReference >  49  < ProjectReference  Include ="../DAL/DAL.csproj" >  50  < Project > {AFF6077D-DD2D-48A0-BFAD-051BD67A6953} </ Project >  51  < Name > DAL </ Name >  52  </ ProjectReference >  53  < ProjectReference  Include ="../IBLL/IBLL.csproj" >  54  < Project > {620770BB-7A27-4585-9B97-44EEE349121D} </ Project >  55  < Name > IBLL </ Name >  56  </ ProjectReference >  57  < ProjectReference  Include ="../Model/Model.csproj" >  58  < Project > {EA43EC2E-5890-4431-BD3E-5F6C090DEA3A} </ Project >  59  < Name > Model </ Name >  60  </ ProjectReference >  61  </ ItemGroup >  62  <!-- 引入MSBuildCommunityTasks -->  63  < Import  Project ="$(MSBuildExtensionsPath)/MSBuildCommunityTasks/MSBuild.Community.Tasks.Targets"   />  64  <!-- 邮件发送 -->  65  <!-- <Target Name="EmailTest" >  66  <Message Text = " Mail sending"></Message>  67  <Mail SmtpServer="$(SmtpServerName)"  68  Subject="Test"  69  Password="$(MailPassword)"  70  From ="$(FromAddress)"  71  To ="$(ToAddress)"  72  Body="This is a test of the mail task." />  73  </Target> -->  74  <!-- 备份文件到FTP -->  75  <!-- <Target Name="Backup" DependsOnTargets="Zip" >  76  <FtpUpload UserName="$(FtpName)"  77  Password="$(FtpPassword)"  78  LocalFile="$(ZipFileName)"  79  RemoteUri="ftp://192.168.1.2/SourceBackup/$(ZipFileName)" />  80  <OnError ExecuteTargets="HandleErrorBackup" />  81  </Target> -->  82  <!-- 备份文件到FTP失败则发送邮件 -->  83  <!-- <Target Name="HandleErrorBackup">  84  <Message Text="Backup failed" />  85  <Mail SmtpServer="$(SmtpServerName)"  86  To="$(ToAddress)"  87  From="$(FromAddress)"  88  Subject="$(ProjectName) Build failed"  89  Body="Backup Failure: Could not finish Backup ." />  90  </Target> -->  91  <!-- 编译项目 -->  92  < Target  Name ="BuildProjectReferences" >  93  < MSBuild  Projects ="@(ProjectReference)"  Targets ="Build"   />  94  </ Target >  95  <!-- 生成压缩文件 -->  96  < Target  Name ="Zip" >  97  <!-- 时间格式 -->  98  < Time  Format ="yyyyMMddHHmmss" >  99  < Output  TaskParameter ="FormattedTime"  PropertyName ="buildDate" /> 100  </ Time > 101  < Zip  Files ="@(ZipFiles)"  ZipFileName ="StartKit V$(Major)-$(Minor)-$(Revision)-$(buildDate).zip" /> 102  </ Target > 103  <!-- 复制文件 --> 104  < Target  Name ="Copy" > 105  <!-- 停止IIS服务 --> 106  < ServiceController  ServiceName ="w3svc"  Action ="Stop"   /> 107  <!-- 使用Robocopy复制编译后的文件到指定位置 /XD是要忽略的文件夹,/XF要忽略的文件类型 --> 108  < Exec  Command ="Robocopy Debug c:/inetpub/StartKit /MIR /XD Fckeditor attachments .svn obj doc Test /XF *.zip *.wdproj *.user *.cs *.csproj"  IgnoreExitCode ="true"   /> 109  <!-- 启动IIS服务 --> 110  < ServiceController  ServiceName ="w3svc"  Action ="Start"   /> 111  </ Target > 112  <!-- 引入WebDeployment --> 113  < Import  Project ="$(MSBuildExtensionsPath)/Microsoft/WebDeployment/v9.0/Microsoft.WebDeployment.targets"   /> 114  <!--  To modify your build process, add your task inside one of the targets below and uncomment it. 115  Other similar extension points exist, see Microsoft.WebDeployment.targets. --> 116  < Target  Name ="BeforeBuild" ></ Target > 117  < Target  Name ="BeforeMerge" ></ Target > 118  < Target  Name ="AfterMerge" ></ Target > 119  < Target  Name ="AfterBuild" > 120  <!-- 编译成功后,执行下面的Targets --> 121  <! —不想生成ZIP文件,可以注释下面ZIP的target-- > 122  < CallTarget  Targets ="Zip" /> 123  < CallTarget  Targets ="Copy"   /> 124  <!-- <CallTarget Targets="EmailTest"/> 125  <CallTarget Targets="Backup" /> --> 126  </ Target > 127  </ Project >

     

    编译部署项目成功后,打开C:/inetpub/StartKit文件夹,看看是否成功复制过去了呢?好的,我去看看,哈哈,文件果然都在,OK,成功啦!

    这时候,在IIS上创建一个虚拟目录或者网站,指向我们部署项目中指定的目录。上一篇我们已经将该项目添加到了CCNET中,所以以后我们每次提交代码后,MSBuild就会编译整个解决方案【当然也会编译部署项目】,如果编译成功,就会自动将最新的程序部署到我们网站上。这样就可以使网站和我们的开发实时保持同步,这只不是唯一的实现方法,其他还有很多可以实现这个功能的方法,大家可以在这里讨论和交流。

    补充:Microsoft Build Engine (MSBuild) 是 Microsoft 和 Visual Studio 的新的生成平台。MSBuild 在如何处理和生成软件方面是完全透明的,使开发人员能够在未安装 Visual Studio 的生成实验室环境中组织和生成产品。通过这几篇教程,我们可以看出,MSBuild的强大功能,如果希望理解更多关于MSBuild的信息,请查看这里http://msdn.microsoft.com/zh-cn/library/ms171451.aspx 。

    如果你对我讲解的这些内容不熟悉,建议你从头开始看这个系列的教程:项目管理实践系列教程。

    最新回复(0)