从部署中排除文件和文件夹

作者 :Jason Lee

本主题介绍如何在生成和打包 Web 应用程序项目时从 Web 部署包中排除文件和文件夹。

本主题是一系列教程的一部分,这些教程基于名为 Fabrikam, Inc 的虚构公司的企业部署要求。本教程系列使用示例解决方案( Contact Manager 解决方案)来表示具有实际复杂程度的 Web 应用程序,包括 ASP.NET MVC 3 应用程序、Windows Communication Foundation (WCF) 服务和数据库项目。

这些教程的核心部署方法基于了解项目文件中所述的拆分 项目文件方法,其中生成过程由两个项目文件控制,一个项目文件包含适用于每个目标环境的生成说明,另一个包含特定于环境的生成和部署设置。 在生成时,特定于环境的项目文件将合并到与环境无关的项目文件中,形成一组完整的生成指令。

概述

在 Visual Studio 2010 中生成 Web 应用程序项目时,Web 发布管道 (WPP) 允许通过将编译的 Web 应用程序打包到可部署的 Web 包中来扩展此生成过程。 然后,可以使用 Internet Information Services (IIS) Web 部署工具 (Web 部署) 将此 Web 包部署到远程 IIS Web 服务器,或通过 IIS 管理器手动导入 Web 包。 生成和打包 Web 应用程序项目中介绍了此打包过程。

那么,如何控制 Web 包中包含的内容? Visual Studio 中的项目设置通过基础项目文件为许多方案提供足够的控制。 但是,在某些情况下,可能需要将 Web 包的内容定制到特定目标环境。 例如,在将应用程序部署到测试环境时,可能需要包含日志文件的文件夹,但在将应用程序部署到过渡或生产环境时排除该文件夹。 本主题将说明如何执行此操作。

默认情况下包含哪些内容?

在 Visual Studio 中配置 Web 应用程序项目属性时,“包/发布”网页上的“要部署的项”列表可指定要包含在 Web 部署包中的内容。 默认情况下,此项设置为 “仅运行此应用程序所需的文件”。

默认情况下,此项设置为“仅运行此应用程序所需的文件”。

选择“ 仅运行此应用程序所需的文件”时,WPP 将尝试确定应将哪些文件添加到 Web 包。 这包括:

  • 项目的所有生成输出。
  • 标记有 “内容”生成操作的任何文件。

注意

确定要包含的文件的逻辑包含在此文件中:
%PROGRAMFILES%\MSBuild\Microsoft\VisualStudio\v10.0\Web\ Microsoft.Web.Publishing.OnlyFilesToRunTheApp.targets

排除特定文件和文件夹

在某些情况下,需要更精细地控制部署哪些文件和文件夹。 如果提前知道要排除哪些文件,并且排除适用于所有目标环境,只需将每个文件的 生成操作 设置为 “无”。

从部署中排除特定文件

  1. “解决方案资源管理器”窗口中,右键单击该文件,然后单击“属性”。
  2. “属性” 窗口的“ 生成操作” 行中,选择“ ”。

但是,这种方法并不总是很方便的。 例如,你可能希望根据目标环境以及从 Visual Studio 外部更改包含哪些文件和文件夹。 例如,在 Contact Manager 示例解决方案中,查看 ContactManager.Mvc 项目的内容:

ContactManager.Mvc 项目的内容。

  • “内部”文件夹包含一些 SQL 脚本,开发人员使用这些脚本来创建、删除和填充本地数据库以进行开发。 不应将此文件夹中的内容部署到过渡或生产环境。
  • Scripts 文件夹包含多个 JavaScript 文件。 其中许多文件仅用于在 Visual Studio 中支持调试或提供 IntelliSense。 其中一些文件不应部署到过渡或生产环境。 但是,你可能希望将它们部署到开发人员测试环境,以便于进行故障排除。

尽管可以操作项目文件以排除特定文件和文件夹,但有一种更简单的方法。 WPP 包含一种机制,通过生成名为 ExcludeFromPackageFoldersExcludeFromPackageFiles 的项目列表来排除文件和文件夹。 可以通过向这些列表添加自己的项来扩展此机制。 为此,需要完成以下高级步骤:

  1. 在项目文件所在的文件夹中创建名为 [project name].wpp.targets 的自定义项目文件。

    注意

    .wpp.targets 文件需要与 Web 应用程序项目文件(例如 ContactManager.Mvc.csproj)位于同一文件夹中,而不是与用于控制生成和部署过程的任何自定义项目文件位于同一文件夹中。

  2. .wpp.targets 文件中,添加 ItemGroup 元素。

  3. ItemGroup 元素中,添加 ExcludeFromPackageFoldersExcludeFromPackageFiles 项,以根据需要排除特定文件和文件夹。

这是此 .wpp.targets 文件的基本结构:

<Project ToolsVersion="4.0" 
         xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>   
    <ExcludeFromPackageFolders Include="[semi-colon-separated folder list]">
      <FromTarget>[arbitrary metadata value]</FromTarget>
    </ExcludeFromPackageFolders>
    <ExcludeFromPackageFiles Include="[semi-colon-separated file list]">
      <FromTarget>[arbitrary metadata value]</FromTarget>
    </ExcludeFromPackageFiles>
  </ItemGroup>
</Project>

请注意,每个项都包含一个名为 FromTarget 的项元数据元素。 这是一个不影响生成过程的可选值;它只是用于指示在有人审阅生成日志时省略特定文件或文件夹的原因。

从 Web 包中排除文件和文件夹

下一过程演示如何将 .wpp.targets 文件添加到 Web 应用程序项目,以及如何在生成项目时使用该文件从 Web 包中排除特定文件和文件夹。

从 Web 部署包中排除文件和文件夹

  1. 在 Visual Studio 2010 中打开解决方案。

  2. 解决方案资源管理器窗口中,右键单击 Web 应用程序项目节点 (例如 ContactManager.Mvc) ,指向“添加”,然后单击“新建项”。

  3. 在“ 添加新项 ”对话框中,选择 “XML 文件” 模板。

  4. 在“ 名称 ”框中,键入 [项目名称].wpp.targets (例如 ContactManager.Mvc.wpp.targets) ,然后单击“ 添加”。

    在“名称”框中,键入项目 name.wpp.targets,然后单击“添加”。

    注意

    如果将新项添加到项目的根节点,则会在项目文件的同一文件夹中创建该文件。 可以通过在 Windows 资源管理器中打开 文件夹来验证这一点。

  5. 在 文件中,添加 Project 元素和 ItemGroup 元素:

    <Project ToolsVersion="4.0" 
             xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <ItemGroup>    
      </ItemGroup>
    </Project>
    
  6. 如果要从 Web 包中排除文件夹,请将 ExcludeFromPackageFolders 元素添加到 ItemGroup 元素:

    1. Include 属性中,提供要排除的文件夹的分号分隔列表。

    2. FromTarget 元数据元素中,提供一个有意义的值来指示为何要排除文件夹,例如 .wpp.targets 文件的名称。

      <ExcludeFromPackageFolders Include="Internal">
        <FromTarget>ContactManager.Mvc.wpp.targets</FromTarget>
      </ExcludeFromPackageFolders>
      
  7. 如果要从 Web 包中排除文件,请将 ExcludeFromPackageFiles 元素添加到 ItemGroup 元素:

    1. Include 属性中,提供要排除的文件的分号分隔列表。

    2. FromTarget 元数据元素中,提供一个有意义的值来指示文件被排除的原因,例如 .wpp.targets 文件的名称。

      <ExcludeFromPackageFiles Include="Scripts\jquery-1.4.4-vsdoc.js;Scripts\jquery-1.4.4.js;Scripts\jquery-ui.js;Scripts\jquery.unobtrusive-ajax.js;Scripts\jquery.validate-vsdoc.js;Scripts\jquery.validate.js;Scripts\jquery.validate.unobtrusive.js;Scripts\MicrosoftAjax.debug.js;Scripts\MicrosoftMvcValidation.debug.js">
        <FromTarget>ContactManager.Mvc.wpp.targets</FromTarget>
      </ExcludeFromPackageFiles>
      
  8. [项目名称].wpp.targets 文件现在应如下所示:

    <Project ToolsVersion="4.0" 
             xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <ItemGroup>   
        <ExcludeFromPackageFolders Include="Internal">
          <FromTarget>ContactManager.Mvc.wpp.targets</FromTarget>
        </ExcludeFromPackageFolders>
        <ExcludeFromPackageFiles Include="Scripts\jquery-1.4.4-
    vsdoc.js;Scripts\jquery-1.4.4.js;Scripts\jquery-ui.js;Scripts\jquery.unobtrusive-ajax.js;Scripts\jquery.validate-vsdoc.js;Scripts\jquery.validate.js;Scripts\jquery.validate.unobtrusive.js;Scripts\MicrosoftAjax.debug.js;Scripts\MicrosoftMvcValidation.debug.js">
          <FromTarget>ContactManager.Mvc.wpp.targets</FromTarget>
        </ExcludeFromPackageFiles>
      </ItemGroup>
    </Project>
    
  9. 保存并关闭 [项目名称].wpp.targets 文件。

下次生成和打包 Web 应用程序项目时,WPP 将自动检测 .wpp.targets 文件。 指定的任何文件和文件夹都不会包含在 Web 包中。

结论

本主题介绍如何在生成 Web 包时排除特定文件和文件夹,方法是在 Web 应用程序项目文件所在的文件夹中创建自定义 .wpp.targets 文件。

深入阅读

有关使用自定义Microsoft 生成引擎 (MSBuild) 项目文件来控制部署过程的详细信息,请参阅了解项目文件和了解生成过程。 有关打包和部署过程的详细信息,请参阅 生成和打包 Web 应用程序项目为 Web 包部署配置参数部署 Web 包