2010-11-27 15 views
52

Estoy usando el botón Publish de Visual Studio para implementar mi sitio web, y quiero una carpeta App_Data diferente en el servidor. Hay una casilla de verificación para Leave extra files on destination (do not delete) que evita que mi carpeta App_Data se elimine, pero luego acumulará una gran cantidad de archivos vestigiales a medida que el sitio web cambie.Hacer que MSDeploy (Visual Studio) no elimine la carpeta App_Data, pero elimine todo lo demás

¿Hay alguna forma de excluir solo App_Data cuando elimina todo?

Respuesta

84

Se puede hacer cuando se invoca manualmente MSDeploy - sólo tiene que añadir el siguiente parámetro:

-skip:Directory=\\App_Data 

Ver Web Deploy Operation Settings. La ruta es una expresión regular, por lo que es bastante flexible.

Si despliega utilizando el script ProjectName.deploy.cmd generado por VS, también puede pasar este parámetro en la variable de entorno _MsDeployAdditionalFlags (cuando se ejecuta ese script).

Esto es lo mejor que he encontrado para nuestras necesidades (tenemos una situación similar a la suya). No intenté integrarlo con el botón Publicar de VS, ya que lo implementamos desde la línea de comandos.

EDIT:

he aprendido algunas cosas sobre MSDeploy ya he publicado esta respuesta, por lo que pensé en actualizar ahora.

En primer lugar, la regla de omisión anterior omite cualquier operación en la ruta coincidente (App_Data). Si se necesita un control más granular, está disponible una sintaxis más detallada. Por ejemplo, para saltar sólo elimina (para mantener los archivos adicionales en el servidor de destino, además de añadir otros nuevos y actualizar los ya existentes):

-skip:skipaction='Delete',objectname='filePath',absolutepath='\\App_Data\\.*' -skip:skipaction='Delete',objectname='dirPath',absolutepath='\\App_Data\\.*' 

Esto salta eliminaciones de todos los archivos y todas las subcarpetas (con todo su contenido) en App_Data, pero no evita las adiciones y actualizaciones.

Otra cosa útil es que las reglas de omisión se pueden definir en el archivo de proyecto (.csproj) para que se incluyan automáticamente en el script .deploy.cmd generado junto con el paquete. Esto hace que sea innecesario pasarlos al script a través de _MsDeployAdditionalFlags.

Se añadirá la regla de salto por encima de si la siguiente se incluye en csproj archivo:

<PropertyGroup> 
    <OnBeforePackageUsingManifest>AddCustomSkipRules</OnBeforePackageUsingManifest> 
</PropertyGroup> 
<Target Name="AddCustomSkipRules"> 
    <ItemGroup> 
    <MsDeploySkipRules Include="SkipDeleteAppData"> 
     <SkipAction>Delete</SkipAction> 
     <ObjectName>filePath</ObjectName> 
     <AbsolutePath>$(_Escaped_PackageTempDir)\\App_Data\\.*</AbsolutePath> 
     <XPath> 
     </XPath> 
    </MsDeploySkipRules> 
    <MsDeploySkipRules Include="SkipDeleteAppData"> 
     <SkipAction>Delete</SkipAction> 
     <ObjectName>dirPath</ObjectName> 
     <AbsolutePath>$(_Escaped_PackageTempDir)\\App_Data\\.*</AbsolutePath> 
     <XPath> 
     </XPath> 
    </MsDeploySkipRules> 
    </ItemGroup> 
</Target> 

(los nombres AddCustomSkipRules y SkipDeleteAppData son completamente arbitraria; $(_Escaped_PackageTempDir) se supone que es posiblemente es necesario, pero en la práctica Siempre lo he visto evaluar en una cadena vacía)

Consulte Web Deploy: Customizing a deployment package y How to set MSDeploy settings in .csproj file para obtener más información.

Una advertencia: esto solo agrega esas reglas al script .deploy.cmd, por lo que es inútil si desea usar el Administrador gráfico de IIS para la distribución de paquetes, ya que no usa ese script (lo mismo se aplica a la implementación desde VS, pero no lo he comprobado).

+0

Bien, gracias por eso. –

+0

¡Impresionante! Incluso había estado en esa página de MS y no la había encontrado. –

+9

Para que funcione durante la implementación a través de la función "Publicar" de Visual Studio, se debe usar 'AfterAddIisSettingAndFileContentsToSourceManifest' en lugar de' OnBeforePackageUsingManifest'. Ver comentario http://blog.alanta.nl/2011/02/web-deploy-customizing-deployment.html?showComment=1314013105475#c1406362862563428999 –

1

¿Ha mirado Paquete/Publicar Web en la configuración del proyecto, porque puede indicarle que exluya archivos en la carpeta App_Data.

+1

Intenté esto, pero no funciona. Todavía intenta eliminar la carpeta en publish – amhed

+0

Hola Cuando uso slowcheetah, a pesar de que ponemos exludefilesfromdeployment, no elimina el archivo. –

0

Desde mi experiencia, MsDeploySkipRules solo se ejecutan al implementar desde la línea de comandos.

Si publica desde Visual Studio a Azure (o utiliza otro método de Web Deploy), puede configurar lo siguiente al publicar.

  • eliminar archivos adicionales en destino
  • excluir archivos de la carpeta App_Data

Cuando "Eliminar archivos adicionales en destino" está marcada, se hará una comparación entre los archivos y carpetas que está desplegando y los que están en el servidor.

Tenga cuidado, puede tener problemas si tiene contenido generado por el usuario, p. Cargas Pero esto podría solucionarse almacenando esas carpetas en una ubicación diferente, p. Almacenamiento S3/Azure.

Web Publishing Profile

Cuestiones relacionadas