在我们的环境中 ,前端web应用、暴露给外部的服务以及内部服务各是一个独立的Visual Studio解决方案,另外SQL数据库也 是一个独立的database解决方案。我们将创建一个主构建脚本文件3rdNational.Master.build,看起来差不多 是这样:
<project name="3rd National Bank" default="build"> <target name="build"> <call target="createStagingEnvironment" /> <nant buildfile="BankDB/BankDB.build" target="build" /> <nant buildfile="ServiceLayer/ServiceLayer.build" target="build" /> <nant buildfile="OnlineBanking/WebUI.build" target="build" /> <nant buildfile="ExternalServices/ExternalServices.build" /> </target></project>这段脚本没有做什么具体的事,它仅仅是调用了那四个解决方案的构建脚本。每个解决方案都有一 个构建文件,其中包含了编译及准备这一部分应用程序的所有代码。现在让我们来看一看其中一个解 决方案的构建脚本。每个解决方案都基于相同的基本步骤:准备、编译及暂存。ServiceLayer.build就是一个 基本的编译脚本,它的语法也非常容易理解:
<project name="ServiceLayer"> <property name="msbuildExe" value="c:windowsmicrosoft.netframeworkv4.0.30319msbuild.exe" /> <target name="build"> <call target="prepare" /> <call target="compile" /> <call target="stage" /> </target> <target name="prepare"> <!-- Implementation omitted --> </target> <target name="compile"> <exec program="${msbuildExe}"> <arg value="ServiceLayer.sln" /> <arg value="/p:Configuration=Release" /> <arg value="/t:rebuild" /> </exec> </target> <target name="stage"> <copy todir="../deploy/BankWcf"> <include name="WcfServices/**/*.svc" /> <include name="WcfServices/**/*.asax" /> <include name="WcfServices/**/*.config" /> <include name="WcfServices/**/*.dll" /> </copy> </target></project>准备步骤可以包括生成AssemblyInfo文件、重编译代理或者任意数量的其它任务。这个例子里的编译步骤 仅仅是简单调用了MSBuild,这是Visual Studio用来编译解决方案的构建引擎。当构建的每一步骤成功后,最 后一步会把生成的文件复制到某个暂存区域,留待之后使用。对于其它三个解决方案我们也采取同样 的做法,只是基于不同的项目类型作些微调。编写构建脚本其实和写代码一样,可以通过不同的做法 达到同样的效果。你可以直接使用命令行编译器替代MSBuild,也可以分别构建每个项目文件而不是整个解决 方案,还可以使用MSDeploy来暂存或部署你的应用程序,取代过滤及复制文件的方式。说到底,这取决于你适 应于哪种方式。只要你的脚本能生成一致的结果,怎样编写都可以。