在上一篇教程项目管理实践【三】每日构建【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解决方案为例子,结构如下:
在上图所示的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
>
[email protected]
</
FromAddress
>
24
<
ToAddress
>
[email protected]
</
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 。