使用 NAnt 构建 ASP.NET Web 应用程序






3.57/5 (4投票s)
本文介绍如何使用 NAnt 为 ASP.NET Web 应用程序实现自动化构建。
引言
如今,夜间构建已成为任何项目开发生命周期中最重要的环节。NAnt 是 .NET 自动化构建最受欢迎的工具之一。NAnt 与 Ant 类似,但它是专门为 .NET 设计的。
本文将简要介绍为 ASP.NET 应用程序编写构建文件的过程。我希望读者了解 XML 技术和 ASP.NET 应用程序部署的基础知识。
背景
ASP.NET 应用程序的部署有点棘手。构建 ASP.NET 应用程序时,它会为项目中包含的每个类库生成一个单独的 DLL 文件。然而,ASP.NET 2.0 不会为代码隐藏文件(例如 C# 的 ".cs" 文件)生成 DLL 文件。我们必须使用 .NET 2.0 Framework 自带的 `aspnet_compiler.exe` 来为 CS 文件生成 DLL 文件。它再次为每个 CS 文件生成一个单独的 DLL。所有这些都使构建和部署过程非常复杂。
在这里,我将指导您如何使用 NAnt 为 ASP.NET 应用程序编写自动化构建的构建文件。NAnt 是一个非常受欢迎的构建工具。它是开源的,您可以从 SourceForge 免费下载。要使用此代码,您需要下载一些外部工具来设置您的开发环境。
Using the Code
如前所述,您必须首先安装“Visual Studio 2005 Web Deployment Projects”。只需从 MSDN 网站下载并将其安装在默认位置。此安装是为了合并 `MSBuild.exe` 生成的多个 DLL 文件。
下载 NAnt 并将文件夹复制到 `C:` 驱动器(您可以将其复制到任何目录;我仅以 `C:` 为例,并在下面的构建文件中使用了相同的路径)。现在转到 `C:\nant\nant-0.85\bin` 文件夹。在这里,您会看到一组 XML/XSL 文件和一个“lib”文件夹。
在此创建一个新文件,并将其命名为 `build.number.xml`。此文件将指定源代码管理中项目的当前版本。复制以下内容并保存文件。
<?xml version="1.0" encoding="utf-8"?>
<build>
<major>1</major>
<minor>0</minor>
<build>0</build>
<release>0</release>
<companyname>CompanyName</companyname>
<copyright>Copyright 2007</copyright>
</build>
上述文件的模式应位于同一文件夹中。创建一个文件并将其命名为 `genVer.xsl`。复制以下代码并保存文件。
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">
#define VER <xsl:value-of select="build/major"/>,
<xsl:value-of select="build/minor"/>,
<xsl:value-of select="build/build"/>,
<xsl:value-of select="build/release"/>
#define STRVER "<xsl:value-of select="build/major"/>,
<xsl:value-of select="build/minor"/>,
<xsl:value-of select="build/build"/>,
<xsl:value-of select="build/release"/>"
#define COMPANYNAME "<xsl:value-of select="build/companyname"/>"
#define COPYRIGHT "<xsl:value-of select="build/copyright"/>"
</xsl:template>
</xsl:stylesheet>
现在我们需要进行一些 XSL 编码,这将帮助我们递增版本号。所以,在此文件夹中创建一个新文件,并将其命名为 `IncrBuild.xsl`。复制以下代码并保存文件。
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/build/build">
<xsl:variable name="buildNumber" select="."/>
<xsl:element name="build">
<xsl:value-of select="$buildNumber + 1"/>
</xsl:element>
</xsl:template>
<xsl:template match="/ | @* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
现在您已准备好编写实际的构建文件。默认情况下,`nant` 文件夹包含一个文件:`Nant.build`。这是一个简单的 XML 文件,您可以在其中编写构建代码。您可以使用扩展名为 “.build” 的单独文件来编写构建代码。您可以使用 `nant.exe` 来运行此构建代码。此 EXE 文件有多个可用选项。您可以从 NAnt 文档中阅读,该文档可在 此处 找到。
我在这里不介绍 NAnt 的基本知识。您可以从 NAnt 的帮助文档中阅读。因此,让我们开始编写自动化构建文件的核心代码。在任何文本或 XML 编辑器中打开 `NAnt.build` 文件。首先,创建根节点,您将在此指定项目名称和默认目标,`NAnt.exe` 将执行该目标来启动构建过程。
<project name="ProjectName" default="buildProject"
xmlns="http://nant.sf.net/schemas/nant-0.85.win32.net-1.0.xsd">
</project>
在 project 标签之间,我们需要编写一些目标(targets)和属性(properties)。为了使我们的代码更加通用和可配置,我们首先需要声明一些属性。请参阅代码注释以获取描述。
<!--Properties for build process-->
<!-- BuildDir is the directory where our .NET source
resides.Project directory for web application-->
<property name="BuildDir" value="D:\Work"/>
<!-- target is the directory where we are going to
store deployable files.-->
<property name="target" value="D:\Work\deploy" overwrite="false" />
<!-- SolutionFileName is the name of your solution file.-->
<property name="SolutionFileName" value="NantTrial.sln"/>
<!-- BuildNumberPath is path of the xml file where your
current build no is specified.-->
<property name="BuildNumberPath"
value="C:\nant\nant-0.85\bin\build.number.xml"/>
<!-- dotnet is the path of the folder where .NET
framework is installed.-->
<property name="dotnet"
value="c:/windows/Microsoft.NET/Framework/v2.0.50727"
overwrite="false"/>
<!-- MSBuildPath is the path for the MSBuild.exe. This file
comes along with .NET framework and
being stored at the same folder.-->
<property name="MSBuildPath"
value="C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe" />
<!-- WebDeploymentExePath is the path of the folder
where you have installed WebDeployment Project.-->
<property name="WebDeploymentExePath"
value="C:\Program Files\MSBuild\Microsoft\WebDeployment\v8.0" />
<!-- WebProjectFolderName is your project's directory name-->
<property name="WebProjectFolderName" value="NantTrial" />
<!-- FinalDeployDllName is name which you want to give your
final .dll file generated by WebDeployment tool.-->
<property name="FinalDeployDllName" value="ProjectName" />
<!-- newReleaseLabel can be used for naming the folder which
contains final deployable files or labelling the source in
source control.-->
<property name="newReleaseLabel" value="ProjectName-0-0-0-0"/>
<!--Major build number-->
<property name="build.version.major" value="0"/>
<!--Minor build number-->
<property name="build.version.minor" value="0"/>
<!--build number-->
<property name="build.version.build" value="0"/>
<!--revision number-->
<property name="build.version.revision" value="0"/>
<!--Ending Properties for build process-->
您可以根据您的需求配置上述属性。构建文件中总共有四个目标。
buildProject
[默认目标,负责构建 .NET 应用程序并在 deploy 文件夹中创建 DLL 文件]clean
[删除之前的 deploy 文件夹]setversion
[在应用程序的 `AssemblyInfo.cs` 文件中设置版本字符串]setVersionString
[设置版本字符串属性,可用于标记源代码或命名部署文件夹]incrementBuildNumber
[此将执行 XSL 文件将当前版本加 1]
所有这些属性都相互依赖,并将以自下而上的方式(5 到 1)执行。您可以使用目标的 “depends” 属性根据您的需求进行配置。您可以下载上面目标的附带示例 `NAnt.build` 文件。文章的关键部分在于 `buildProject` 目标。在这里,我们将构建 Web 应用程序。
要构建应用程序,我们必须使用 .NET 的命令行实用程序 `MSBuild.exe`。此文件默认位于 .NET Framework 的文件夹中。此文件将解决方案文件名作为参数。使用以下代码执行它。
<exec program="${MSBuildPath}">
<arg value="${BuildDir}\${SolutionFileName}" />
</exec>
现在可以使用 `aspnet_compiler.exe` 来编译代码。此文件也随 .NET Framework 安装一起提供,并位于同一文件夹中。`aspnet_compiler.exe` 有多个命令行选项。您可以根据您的需求使用它。所有选项的完整描述可在 此处 找到。使用以下代码执行 `aspnet_compiler.exe`。
<exec program="${dotnet}/aspnet_compiler.exe"
commandline=
"-f -u -p ${BuildDir}\${WebProjectFolderName} -v / ${target}"/>
此工具将为您的类库生成一个单独的 DLL,但问题是它还为每个 CS 文件生成单独的 DLL。将这些多个 DLL 文件(每个网页一个)打包到您的构建中不是一个好主意。因此,需要将这些多个 DLL 文件合并到一个最终的可部署 DLL 中。
您可以使用 Visual Studio 2005 Web Deployment Projects 来完成此操作。安装 Web Deployment Projects 会将 `aspnet_merge.exe` 复制到您的构建计算机。它将目标文件夹名称和最终 DLL 的名称作为参数。使用以下代码执行 `aspnet_merge.exe`。
<exec program="${WebDeploymentExePath}\aspnet_merge.exe"
commandline="${target} -o ${FinalDeployDllName} -xmldocs"/>
整个过程会将一些不必要的文件复制到目标部署文件夹,我们需要将其删除。使用以下命令删除这些文件:
<delete>
<!--Remove unnecessary files from the build.-->
<fileset>
<include name="${target}/*.build" />
<include name="${target}/*.scc" />
<include name="${target}/*.sln" />
<include name="${target}/build.*" />
</fileset>
</delete>
现在打开命令提示符。将目录更改到您的 NAnt 文件夹(在我的情况下是 `C:\nant\nant-0.85\bin\`)。输入 `Nant.exe` 并按“Enter”。构建过程将开始。您可以在命令行上看到详细信息。如果构建成功,它将显示以下消息:
BUILD SUCCEEDED
Total time: 33.3 seconds.
现在检查您的“target”文件夹,即构建文件中 “target” 属性的值。在我的情况下是 `D:\Work\deploy`。所有 Web 页面(ASPX)都应该在那里,以及一个 bin 文件夹和一个 `precompiledApp.config` 文件。bin 文件夹应包含所有类库的 DLL 和一个用于您的 CS 文件的 DLL,而不是每个 CS 文件都有单独的 DLL。DLL 的名称应该是 FinalDeployDllName
属性的值。在我的情况下是 ProjectName
。
太棒了!您现在已准备好部署。NAnt 自动化构建的主要优势在于您可以安排您的夜间构建。只需创建一个带有 `NAnt.exe` 命令的 BAT 文件,并使用 Windows 任务计划程序安排其运行时间。
关注点
在设计 ASP.NET 应用程序时,应牢记不要将解决方案文件保存在存储 Web 页面的同一文件夹中。在这种情况下,`MSBuild.exe` 将无法执行构建。
我计划撰写一篇单独的文章,介绍 NAnt 的常用目标,例如源代码管理任务、发送电子邮件、将文件复制到服务器上的文件夹等。我将很快开始。
版本控制目标参考了 此处。请查看这篇关于使用 NAnt 进行版本控制的优秀博客。