打包过程故障排除

作者 :Jason Lee

本主题介绍如何使用 Microsoft 生成引擎 (MSBuild) 中的 EnablePackageProcessLoggingAndAssert 属性收集有关打包过程的详细信息。

EnablePackageProcessLoggingAndAssert 属性设置为 true 时,MSBuild 将:

  • 将有关打包过程的其他信息添加到生成日志。
  • 在某些情况下记录错误,例如,如果在打包列表中找到重复文件。
  • ProjectName _Package 文件夹中创建一个日志目录,并使用它记录有关要打包的文件的信息。

如果打包过程失败,或者 Web 部署包不包含所需的文件,则可以使用此信息对过程进行故障排除,并查明出现问题的位置。

注意

EnablePackageProcessLoggingAndAssert 属性仅在使用调试配置生成项目时有效。 在其他配置中忽略 属性。

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

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

了解 EnablePackageProcessLoggingAndAssert 属性

生成和打包 Web 应用程序项目 介绍了 Web 发布管道 (WPP) 如何提供一组 MSBuild 目标,以扩展 MSBuild 的功能,并使它能够与 Internet Information Services (IIS) Web 部署工具 (Web 部署) 集成。 打包 Web 应用程序项目时,需要调用 WPP 目标。

许多这些 WPP 目标都包含条件逻辑,这些逻辑在 EnablePackageProcessLoggingAndAssert 属性设置为 true 时记录其他信息。 例如,如果查看 Package 目标,可以看到,如果 EnablePackageProcessLoggingAndAssert 等于 true,则它会创建一个额外的日志目录并将文件列表写入文本文件。

<Target Name="Package"
        Condition="$(_CreatePackage)"
        DependsOnTargets="$(PackageDependsOn)">

    <!--Log the information  Set $(EnablePackageProcessLoggingAndAssert) to True        
                 if you want to see this information-->
    <MakeDir Condition="$(EnablePackageProcessLoggingAndAssert) And 
                        !Exists('$(PackageLogDir)')"
             Directories="$(PackageLogDir)" />
    <WriteLinesToFile Condition="$(EnablePackageProcessLoggingAndAssert)"
                      Encoding="utf-8"
                      File="$(PackageLogDir)\Prepackage.txt"
                      Lines="@(FilesForPackagingFromProject->'
                             From:%(Identity) 
                             DestinationRelativePath:%(DestinationRelativePath) 
                             Exclude:%(Exclude) 
                             FromTarget:%(FromTarget) 
                             Category:%(Category)
                             ProjectFileType:%(ProjectFileType)')" 
                      Overwrite="True" />

注意

WPP 目标在 %PROGRAMFILES (x86) %\MSBuild\Microsoft\VisualStudio\v10.0\Web 文件夹中的 Microsoft.Web.Publishing.targets 文件中定义。 可以在 Visual Studio 2010 或任何 XML 编辑器中打开此文件并查看目标。 注意不要修改文件的内容。

启用其他日志记录

可以通过各种方式为 EnablePackageProcessLoggingAndAssert 属性提供值,具体取决于项目的生成方式。

如果从命令行生成项目,则可以为 EnablePackageProcessLoggingAndAssert 属性提供一个值作为命令行参数:

MSBuild.exe /t:Build
            /p:Configuration=DEBUG
            /p:DeployOnBuild=true
            /p:DeployTarget=Package
            /p:EnablePackageProcessLoggingAndAssert=true
            [Your project].csproj

如果使用自定义项目文件来生成项目,则可以在 MSBuild 任务的 Properties 属性中包含 EnablePackageProcessLoggingAndAssert 值:

<Target Name="BuildProjects" Condition=" '$(BuildingInTeamBuild)'!='true' ">
   <MSBuild Projects="@(ProjectsToBuild)"
            Properties="OutDir=$(OutputRoot);
                        Configuration=$(Configuration);
                        DeployOnBuild=true;
                        DeployTarget=Package;
                        EnablePackageProcessLoggingAndAssert=true"
            Targets="Build" />
  </Target>

如果使用 Team Foundation Server (TFS) 生成定义来生成项目,则可以在 MSBuild Arguments 行中为 EnablePackageProcessLoggingAndAssert 属性提供值:如果使用 Team Foundation Server (T F S) 生成定义来生成项目,则可以在 MSBuild 参数中为 EnablePackageProcessLoggingAndAssert 属性提供值。

注意

有关创建和配置生成定义的详细信息,请参阅 创建支持部署的生成定义

或者,如果要在每个生成中包含包,可以修改 Web 应用程序项目的项目文件,将 EnablePackageProcessLoggingAndAssert 属性设置为 true。 应将 属性添加到 .csproj 或 .vbproj 文件中的第一个 PropertyGroup 元素。

<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="...">
  <PropertyGroup>
    <EnablePackageProcessLoggingAndAssert 
       Condition=" '$(EnablePackageProcessLoggingAndAssert)' == '' ">
         true
    </EnablePackageProcessLoggingAndAssert>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>

查看日志文件

生成并打包 EnablePackageProcessLoggingAndAssert 设置为 true 的 Web 应用程序项目时,MSBuild 会在 ProjectName_Package 文件夹中创建名为 Log 的其他文件夹。 Log 文件夹包含各种文件:

MSBuild 在 ProjectName_Package 文件夹中创建名为 Log 的其他文件夹。

你看到的文件列表将因项目和生成过程中的内容而异。 但是,这些文件通常用于记录 WPP 在过程的各个阶段收集用于打包的文件列表:

  • PreExcludePipelineCollectFilesPhaseFileList.txt 文件列出了 MSBuild 在删除指定排除的任何文件之前为打包而收集的文件。

  • 删除指定排除的任何文件后, AfterExcludeFilesFilesList.txt 文件包含修改的文件列表。

    注意

    有关从打包过程中排除文件和文件夹的详细信息,请参阅 从部署中排除文件和文件夹

  • AfterTransformWebConfig.txt文件列出了在执行任何Web.config转换后收集的用于打包的文件。 在此列表中,任何特定于配置的 Web.config 转换文件(如 Web.Debug.configWeb.Release.config)都从要打包的文件列表中排除。 单个转换 Web.config 包含在其位置中。

  • 参数化Web.config文件中的连接字符串后,PostAutoParameterizationWebConfigConnectionStrings.txt文件包含文件列表。 此过程允许你在部署包时将连接字符串替换为目标环境的正确设置。

  • Prepackage.txt 文件包含要包含在包中的最终预生成文件列表。

注意

其他日志文件的名称通常对应于 WPP 目标。 可以通过检查 %PROGRAMFILES (x86) %\MSBuild\Microsoft\VisualStudio\v10.0\Web 文件夹中的 Microsoft.Web.Publishing.targets 文件来查看这些目标。

如果 Web 包的内容与预期内容不符,查看这些文件可能是一种有用的方法,可用于确定在流程中的哪个时间点出现问题。

结论

本主题介绍了如何使用 MSBuild 中的 EnablePackageProcessLoggingAndAssert 属性对打包过程进行故障排除。 它介绍了向生成过程提供属性值的不同方式,并介绍了将 属性设置为 true 时记录的其他信息。

深入阅读

有关使用自定义 MSBuild 项目文件来控制部署过程的详细信息,请参阅了解项目文件和了解生成过程。 有关 WPP 及其如何管理打包过程的详细信息,请参阅 生成和打包 Web 应用程序项目。 有关如何从 Web 部署包中排除特定文件和文件夹的指南,请参阅 从部署中排除文件和文件夹