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

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

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.57/5 (4投票s)

2007 年 9 月 13 日

CPOL

6分钟阅读

viewsIcon

107065

downloadIcon

812

本文介绍如何使用 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 免费下载。要使用此代码,您需要下载一些外部工具来设置您的开发环境。

  1. NAnt
  2. Visual Studio 2005 Web Deployment Projects

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-->

您可以根据您的需求配置上述属性。构建文件中总共有四个目标。

  1. buildProject [默认目标,负责构建 .NET 应用程序并在 deploy 文件夹中创建 DLL 文件]
  2. clean [删除之前的 deploy 文件夹]
  3. setversion [在应用程序的 `AssemblyInfo.cs` 文件中设置版本字符串]
  4. setVersionString [设置版本字符串属性,可用于标记源代码或命名部署文件夹]
  5. 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 进行版本控制的优秀博客。

© . All rights reserved.