65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 CruiseControl.Net 和 MSBuild 自动化 ASP.NET Web 应用程序项目构建

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.92/5 (6投票s)

2007年12月10日

CPOL

2分钟阅读

viewsIcon

99496

本文描述了如何使用 CruiseControl.Net 和 MSBuild 自动化 ASP.NET Web 应用程序项目的构建

引言

我最近接触了 CruiseControl.Net,并一直在使用它来进行团队的构建自动化。在深入研究配置的细节之前,让我解释一下我的开发环境。我们使用的是 Visual Studio 2005 Web 应用程序项目。它遵循三层(表示层、业务层、数据访问层)架构。我通常遵循 Visual Studio IDE 的“构建 -> 发布 <Web 网站>”选项来构建项目并将构建传递给测试部门。此选项允许将应用程序发布到通过“发布 Web”对话框设置的特定磁盘路径。

背景

使用 CruiseControl.Net,我需要一种方法来自动化这个过程。在本文中,我解释了如何使用 Microsoft 的构建引擎 MSBuild 来实现。在这里,我想声明一下,这可能不是自动化构建的最佳方法。我只是描述了我的做法,并且它对我有用。希望它听起来有意义,并且对某人有所帮助。

描述

以下是我的 MSBuild 脚本的内容

<Project DefaultTargets="DoPublish" 
	xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <SourceFileRootFolder>$(CCNetWorkingDirectory)</SourceFileRootFolder>
    <WebFolder>MyProject.Web</WebFolder>
    <ReleaseFolder>c:\TestDeploy\v$(CCNetLabel)</ReleaseFolder>
  </PropertyGroup>
  <PropertyGroup Condition ="$(CCNetWorkingDirectory) == ''">
    <SourceFileRootFolder>c:\testcc</SourceFileRootFolder>
    <ReleaseFolder>c:\TestDeploy\v</ReleaseFolder>
  </PropertyGroup>
  <ItemGroup>
    <DefaultBinFiles Include="$(SourceFileRootFolder)\DefaultBinFiles\*.*"/>
    <ProjectBinFiles Include="$(SourceFileRootFolder)\$(WebFolder)\bin\*.*"/> 
  </ItemGroup>
  <Target Name="CleanSource">
    <Message Text="Removing all source files from $(ReleaseFolder)" />
    <RemoveDir Directories="$(ReleaseFolder)" />
  </Target> 
  <Target Name="DoPublish">
    <MSBuild Projects="$(SourceFileRootFolder)\MyProject.sln" Targets="Clean;Build" />
    <CallTarget Targets="CleanSource"/>
    <MSBuild Projects="$(SourceFileRootFolder)\$(WebFolder)\MyProject.Web.csproj" 
Targets="_CopyWebApplication;_BuiltWebOutputGroupOutput" 
	Properties="OutDir=$(ReleaseFolder)\" ></MSBuild>
    <Copy SourceFiles="@(DefaultBinFiles)" 
	DestinationFolder="$(ReleaseFolder)\$(WebFolder)\bin\"></Copy>
    <Copy SourceFiles="@(ProjectBinFiles)" 
	DestinationFolder="$(ReleaseFolder)\$(WebFolder)\bin\"></Copy>
  </Target>
</Project>

我保留一个单独的文件夹“DefaultBinFiles”,我希望将它的内容放置在构建的 bin 文件中。这可能包含缓存在项目或项目中使用的其他 com 引用的任何第三方程序集的副本。ProjectBinFiles 包含在项目的 bin 文件夹中创建的程序集。 

MSBuild 元素执行解决方案的清理构建。CleanSource 删除发布文件夹。下一个 MSBuild 命令指示执行 _CopyWebApplication _BuildWebOutputGroupOutput 目标。这些目标可以在 Program Files\MSBuild\Microsoft\VisualStudio\v8.0\WebApplications\Microsoft.WebApplication.targets 中找到。这还需要对 Web csproj 文件进行调整。将以下部分添加到 csproj 文件中,放在 Project 标签之间的任何位置。请注意,csproj 文件实际上是一个 MSBuild 脚本。

<PropertyGroup>
    <WebProjectOutputDir>$(OutDir)\$(MSBuildProjectName)</WebProjectOutputDir>
  </PropertyGroup>

默认情况下,构建输出放置在 _PublishedWebsites 子文件夹下。以上部分消除了这种情况,并将构建直接放置在 ReleaseFolder 标签中设置的自定义文件夹下。脚本中的接下来的两个 copy 元素递归地将 DefaultBinFilesProjectBinFiles 文件夹的内容复制到 ReleaseFolderbin 文件夹。

将以下 XML 添加到 ccnet.config 文件

<msbuild>
  <executable>C:\WinNT\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe</executable>
  <workingDirectory>c:\TestCC\</workingDirectory>
  <projectFile>MSBuild.xml</projectFile>
  <targets>DoPublish</targets>
  <timeout>300</timeout>
  <logger>ThoughtWorks.CruiseControl.MsBuild.XmlLogger,
		ThoughtWorks.CruiseControl.MsBuild.dll</logger>
</msbuild>

如您所见,CruiseControl.Net 被指示使用 msbuild 来执行在 c:\TestCC\MSBuild.xml 中提供的构建任务。DoPublish 是要执行的目标。

结论

遵循上述 MSBuild 配置会将 ASP.NET Web 应用程序项目的构建输出放置在磁盘上的特定文件夹中,并将它链接到 CruiseControl 会自动执行整个构建过程。有关设置 CruiseControl.Net 的信息,请参阅 如何为初学者设置 CruiseControl.NET。 

© . All rights reserved.