Excluir archivos y carpetas de la implementación

por Jason Lee

En este tema se describe cómo puede excluir archivos y carpetas de un paquete de implementación web al compilar y empaquetar un proyecto de aplicación web.

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.

Información general

Al compilar un proyecto de aplicación web en Visual Studio 2010, la canalización de publicación web (WPP) le permite ampliar este proceso de compilación si empaqueta la aplicación web compilada en un paquete web que se pueda implementar. Después, puede usar la Herramienta de implementación web (Web Deploy) de Internet Information Services (IIS) para implementar este paquete web en un servidor web IIS remoto o importar el paquete web manualmente desde el Administrador de IIS. Este proceso de empaquetado se explica en Compilación y empaquetado de proyectos de aplicación web.

¿Cómo se controla lo que se incluye en el paquete web? La configuración del proyecto en Visual Studio, mediante el archivo del proyecto subyacente, proporciona control suficiente para una gran cantidad de escenarios. Pero, en algunos escenarios, querrá adaptar el contenido del paquete web a entornos de destino específicos. Por ejemplo, es posible que quiera incluir una carpeta para los archivos de registro al implementar la aplicación en un entorno de prueba, pero excluir la carpeta al implementar la aplicación en un entorno de ensayo o producción. En este tema se muestra cómo hacerlo.

¿Qué se incluye de forma predeterminada?

Al configurar las propiedades del proyecto de aplicación web en Visual Studio, la lista Elementos que se implementarán de la página Empaquetar/publicar web le permite especificar lo que quiere incluir en el paquete de implementación web. De forma predeterminada, se establece en Solo los archivos necesarios para ejecutar esta aplicación.

By default, this is set to Only files needed to run this application.

Al elegir Solo los archivos necesarios para ejecutar esta aplicación, WPP intentará determinar qué archivos se deben agregar al paquete web. Esto incluye:

  • Todas las salidas de compilación del proyecto.
  • Cualquier archivo marcado con una acción de compilación de Content.

Nota:

La lógica que determina qué archivos incluir se incluye en este archivo:
%PROGRAMFILES%\MSBuild\Microsoft\VisualStudio\v10.0\Web\ Microsoft.Web.Publishing.OnlyFilesToRunTheApp.targets

Exclusión de archivos y carpetas específicos

En algunos casos, querrá tener un control más preciso sobre qué archivos y carpetas se implementan. Si sabe qué archivos quiere excluir con antelación y la exclusión se aplica a todos los entornos de destino, simplemente puede establecer la acción de compilación de cada archivo en Ninguno.

Para excluir archivos específicos de la implementación

  1. En la ventana Explorador de soluciones, haga clic con el botón derecho en el archivo y, después, haga clic en Propiedades.
  2. En la ventana Propiedades, en la fila Acción de compilación, seleccione Ninguno.

Pero este enfoque no siempre es adecuado. Por ejemplo, puede que quiera variar los archivos y carpetas que se incluyen según el entorno de destino y desde fuera de Visual Studio. Por ejemplo, en la solución de ejemplo Contact Manager, examine el contenido del proyecto ContactManager.Mvc:

The contents of the ContactManager.Mvc project.

  • La carpeta Internal contiene algunos scripts SQL que el desarrollador usa para crear, quitar y rellenar bases de datos locales con fines de desarrollo. No se debe implementar nada de esta carpeta en un entorno de ensayo o de producción.
  • La carpeta Scripts contiene varios archivos de JavaScript. Muchos de estos archivos se incluyen solo para admitir la depuración o proporcionar IntelliSense en Visual Studio. Algunos de estos archivos no se deben implementar en entornos de ensayo o de producción. Pero es posible que quiera implementarlos en un entorno de prueba para desarrolladores para facilitar la solución de problemas.

Aunque puede manipular los archivos del proyecto para excluir archivos y carpetas específicos, hay una manera más sencilla. WPP incluye un mecanismo para excluir archivos y carpetas mediante la creación de las listas de elementos ExcludeFromPackageFolders y ExcludeFromPackageFiles. Puede ampliar este mecanismo y agregar elementos propios a estas listas. Para ello, debe completar estos pasos generales:

  1. Cree un archivo del proyecto personalizado denominado [nombre del proyecto].wpp.targets en la misma carpeta que el archivo del proyecto.

    Nota:

    El archivo .wpp.targets debe ir en la misma carpeta que el archivo del proyecto de aplicación web (por ejemplo, ContactManager.Mvc.csproj), no en la misma carpeta que cualquier archivo del proyecto personalizado que use para controlar el proceso de compilación e implementación.

  2. En el archivo .wpp.targets, agregue un elemento ItemGroup.

  3. En el elemento ItemGroup, agregue elementos ExcludeFromPackageFolders y ExcludeFromPackageFiles para excluir archivos y carpetas específicos según sea necesario.

Esta es la estructura básica de este archivo .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>

Tenga en cuenta que cada elemento incluye un elemento de metadatos de elemento denominado FromTarget. Se trata de un valor opcional que no afecta al proceso de compilación; simplemente sirve para indicar por qué se han omitido archivos o carpetas concretos si alguien revisa los registros de compilación.

Exclusión de archivos y carpetas de un paquete web

En el siguiente procedimiento se muestra cómo agregar un archivo .wpp.targets a un proyecto de aplicación web y cómo usar el archivo para excluir archivos y carpetas específicos del paquete web al compilar el proyecto.

Para excluir archivos y carpetas de un paquete de implementación web

  1. Abra la solución en Visual Studio 2010.

  2. En la ventana Explorador de soluciones, haga clic con el botón derecho en el nodo del proyecto de aplicación web (por ejemplo, ContactManager.Mvc), seleccione Agregar y, después, haga clic en Nuevo elemento.

  3. En el cuadro de diálogo Agregar nuevo elemento, seleccione la plantilla Archivo XML.

  4. En el cuadro Nombre, escriba [nombre del proyecto].wpp.targets (por ejemplo, ContactManager.Mvc.wpp.targets) y, después, haga clic en Agregar.

    In the Name box, type project name.wpp.targets, and then click Add.

    Nota:

    Si agrega un nuevo elemento al nodo raíz de un proyecto, el archivo se crea en la misma carpeta que el archivo del proyecto. Para comprobarlo, abra la carpeta en el Explorador de Windows.

  5. En el archivo, agregue un elemento Project y un elemento ItemGroup:

    <Project ToolsVersion="4.0" 
             xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <ItemGroup>    
      </ItemGroup>
    </Project>
    
  6. Si quiere excluir carpetas del paquete web, agregue un elemento ExcludeFromPackageFolders al elemento ItemGroup:

    1. En el atributo Include, proporcione una lista separada por punto y coma de las carpetas que quiera excluir.

    2. En el elemento de metadatos FromTarget, proporcione un valor descriptivo para indicar por qué se excluyen las carpetas, como el nombre del archivo .wpp.targets.

      <ExcludeFromPackageFolders Include="Internal">
        <FromTarget>ContactManager.Mvc.wpp.targets</FromTarget>
      </ExcludeFromPackageFolders>
      
  7. Si quiere excluir archivos del paquete web, agregue un elemento ExcludeFromPackageFiles al elemento ItemGroup:

    1. En el atributo Include, proporcione una lista separada por punto y coma de los archivos que quiera excluir.

    2. En el elemento de metadatos FromTarget, proporcione un valor descriptivo para indicar por qué se excluyen los archivos, como el nombre del archivo .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. El archivo [nombre del proyecto].wpp.targets ahora debería ser similar al siguiente:

    <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. Guarde y cierre el archivo [nombre del proyecto].wpp.targets.

La próxima vez que compile y empaquete el proyecto de aplicación web, WPP detectará automáticamente el archivo .wpp.targets. Los archivos y carpetas especificados no se incluirán en el paquete web.

Conclusión

En este tema se ha descrito cómo excluir archivos y carpetas específicos al compilar un paquete web mediante la creación de un archivo .wpp.targets personalizado en la misma carpeta que el archivo del proyecto de aplicación web.

Lecturas adicionales

Para más información sobre el uso de archivos del proyecto de Microsoft Build Engine (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 el proceso de empaquetado e implementación, vea Compilación y empaquetado de proyectos de aplicación web, Configuración de parámetros para la implementación de paquetesweb e Implementación de paquetes web.