Solucionar problemas del proceso de empaquetado

por Jason Lee

En este tema se describe cómo puede recopilar información detallada sobre el proceso de empaquetado mediante la propiedad EnablePackageProcessLoggingAndAssert de Microsoft Build Engine (MSBuild).

Al establecer la propiedad EnablePackageProcessLoggingAndAssert en true, MSBuild hará lo siguiente:

  • Agregar información adicional sobre el proceso de empaquetado a los registros de compilación.
  • Registrar errores en determinadas condiciones, por ejemplo, si se encuentran archivos duplicados en la lista de empaquetado.
  • Crear un directorio de registro en la carpeta NombreDelProyecto_Package y usarlo para registrar información sobre los archivos que se empaquetan.

Si se produce un error en el proceso de empaquetado o los paquetes de implementación web no contienen los archivos que espera, puede usar esta información para solucionar problemas del proceso e identificar dónde van mal las cosas.

Nota:

La propiedad EnablePackageProcessLoggingAndAssert solo funciona si compila el proyecto mediante la configuración Depuración. La propiedad se omite en otras configuraciones.

Este tema forma parte de una serie de tutoriales basados en los requisitos de implementación empresarial de una empresa ficticia denominada Fabrikam, Inc. En esta serie de tutoriales se utiliza una solución de ejemplo (Contact Manager) para representar una aplicación web con un nivel de complejidad realista, que incluye una aplicación ASP.NET MVC 3, un servicio Windows Communication Foundation (WCF) y un proyecto de base de datos.

El método de implementación que constituye el núcleo de estos tutoriales se basa en el enfoque del archivo de proyecto dividido descrito en Descripción del archivo del proyecto, en el que el proceso de compilación está controlado por dos archivos de proyecto: uno que contiene las instrucciones de compilación que se aplican a todos los entornos de destino y otro que contiene los ajustes de compilación e implementación específicos del entorno. En tiempo de compilación, el archivo del proyecto específico del entorno se combina en el archivo del proyecto independiente del entorno para formar un conjunto completo de instrucciones de compilación.

Descripción de la propiedad EnablePackageProcessLoggingAndAssert

En Compilación y empaquetado de proyectos de aplicación web se ha descrito cómo la canalización de publicación web (WPP) proporciona un conjunto de destinos de MSBuild que amplían la funcionalidad de MSBuild y permiten integrarlo con la herramienta de implementación web (Web Deploy) de Internet Information Services (IIS). Al empaquetar un proyecto de aplicación web, se invocan destinos de WPP.

Muchos de estos destinos de WPP incluyen lógica condicional que registra información adicional cuando la propiedad EnablePackageProcessLoggingAndAssert se establece en true. Por ejemplo, si revisa el destino Package, puede ver que crea un directorio de registro adicional y escribe una lista de archivos en un archivo de texto si EnablePackageProcessLoggingAndAssert es igual a 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" />

Nota:

Los destinos de WPP se definen en el archivo Microsoft.Web.Publishing.targets en la carpeta %PROGRAMFILES(x86)%\MSBuild\Microsoft\VisualStudio\v10.0\Web. Puede abrir este archivo y revisar los destinos en Visual Studio 2010 o cualquier editor XML. Tenga cuidado de no modificar el contenido del archivo.

Habilitación del registro adicional

Puede proporcionar un valor para la propiedad EnablePackageProcessLoggingAndAssert de varias maneras, en función de cómo compile el proyecto.

Si compila el proyecto desde la línea de comandos, puede proporcionar un valor para la propiedad EnablePackageProcessLoggingAndAssert como argumento de línea de comandos:

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

Si usa un archivo del proyecto personalizado para compilar los proyectos, puede incluir el valor EnablePackageProcessLoggingAndAssert en el atributo Properties de la tarea MSBuild:

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

Si usa una definición de compilación de Team Foundation Server (TFS) para compilar los proyectos, puede proporcionar un valor para la propiedad EnablePackageProcessLoggingAndAssert en la fila Argumentos de MSBuild:If you're using a Team Foundation Server (T F S) build definition to build your projects, you can supply a value for the EnablePackageProcessLoggingAndAssert property in the MSBuild Arguments.

Nota:

Para más información sobre cómo crear y configurar definiciones de compilación, vea Creación de una definición de compilación compatible con la implementación.

Como alternativa, si quiere incluir el paquete en cada compilación, puede modificar el archivo del proyecto de aplicación web para establecer la propiedad EnablePackageProcessLoggingAndAssert en true. Debe agregar la propiedad al primer elemento PropertyGroup dentro del archivo .csproj o .vbproj.

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

Revisión de los archivos de registro

Al compilar y empaquetar un proyecto de aplicación web con EnablePackageProcessLoggingAndAssert establecida en true, MSBuild crea una carpeta adicional denominada Log en la carpeta NombreDelProyecto_Package. La carpeta Log contiene varios archivos:

MSBuild creates an additional folder named Log in the ProjectName_Package folder.

La lista de archivos que verá variará según el contenido del proyecto y el proceso de compilación. Pero estos archivos se usan normalmente para registrar la lista de archivos que WPP recopila para el empaquetado, en varias fases del proceso:

  • El archivo PreExcludePipelineCollectFilesPhaseFileList.txt enumera los archivos que MSBuild recopila para empaquetar antes de que se quiten los archivos especificados para la exclusión.

  • El archivo AfterExcludeFilesFilesList.txt contiene la lista de archivos modificados después de quitar los archivos especificados para la exclusión.

    Nota:

    Para más información sobre cómo excluir archivos y carpetas del proceso de empaquetado, vea Exclusión de archivos y carpetas de la implementación.

  • El archivo AfterTransformWebConfig.txt enumera los archivos recopilados para empaquetar después de realizar cualquier transformación de Web.config. En esta lista, los archivos de transformación de Web.config específicos de la configuración, como Web.Debug.config y Web.Release.config, se excluyen de la lista de archivos para el empaquetado. En su lugar se incluye una única instancia de Web.config transformada.

  • El archivo PostAutoParameterizationWebConfigConnectionStrings.txt contiene la lista de archivos después de que se hayan parametrizado las cadenas de conexión en el archivo Web.config. Este es el proceso que le permite reemplazar las cadenas de conexión por la configuración adecuada para el entorno de destino al implementar el paquete.

  • El archivo Prepackage.txt contiene la lista de archivos predefinidos finalizados que se incluirán en el paquete.

Nota:

Los nombres de los archivos de registro adicionales normalmente se corresponden a destinos de WPP. Puede revisar estos destinos si examina el archivo Microsoft.Web.Publishing.targets en la carpeta %PROGRAMFILES(x86)%\MSBuild\Microsoft\VisualStudio\v10.0\Web.

Si el contenido del paquete web no es el que esperaba, revisar estos archivos puede ser una manera útil de identificar en qué punto del proceso se han producido errores.

Conclusión

En este tema se ha descrito cómo puede usar la propiedad EnablePackageProcessLoggingAndAssert en MSBuild para solucionar problemas del proceso de empaquetado. Se han explicado las distintas formas en que puede proporcionar el valor de propiedad al proceso de compilación y se ha descrito la información adicional que se registra al establecer la propiedad en true.

Lecturas adicionales

Para más información sobre el uso de archivos del proyecto de MSBuild personalizados para controlar el proceso de implementación, vea Descripción del archivo del proyecto y Descripción del proceso de compilación. Para más información sobre WPP y cómo administra el proceso de compilación y empaquetado, vea Compilación y empaquetado de proyectos de aplicación web. Para obtener instrucciones sobre cómo excluir archivos y carpetas específicos de paquetes de implementación web, vea Exclusión de archivos y carpetas de la implementación.