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

在上一篇教程项目管理实践【三】每日构建【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 VS2005
http://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解决方案为例子,结构如下:

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

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

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

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

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

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

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

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

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

优点:使用简单

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

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

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

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

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

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

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

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

方法二:使用WebDeployment+MSBuild+Robocopy

优点:功能强大

缺点:配置有点麻烦

这个方法不用配置Property Pages,直接右键点击StartKit.csproj_deploy项目文件,在菜单中点击Open Project File打开部署项目文件:
项目管理实践【五】自动编译和发布网站【Using Visual Studio with Source Control System to build and publish website automatically】

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

  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项目管理实践【五】自动编译和发布网站【Using Visual Studio with Source Control System to build and publish website automatically】"></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项目管理实践【五】自动编译和发布网站【Using Visual Studio with Source Control System to build and publish website automatically】项目管理实践【五】自动编译和发布网站【Using Visual Studio with Source Control System to build and publish website automatically】项目管理实践【五】自动编译和发布网站【Using Visual Studio with Source Control System to build and publish website automatically】项目管理实践【五】自动编译和发布网站【Using Visual Studio with Source Control System to build and publish website automatically】项目管理实践【五】自动编译和发布网站【Using Visual Studio with Source Control System to build and publish website automatically】" />
 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

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

 

 

上一篇:从物联网到IIoT再到工业4.0


下一篇:直播 | 阿里、携程、网易共同出品, 后端架构工程实践系列直播