visual studio publicar net deploy asp aplicacion asp.net .net msdeploy

asp.net - studio - ¿Cómo puedo hacer que msdeploy cree App_Data si no existe, pero no borro ningún contenido del directorio remoto?



web deploy visual studio 2017 (4)

Cómo desplegar App_Data al comenzar desde cero

@tdykstra entendió bien esta parte . Para obtener App_Data (y las ACL configuradas automáticamente), hice lo siguiente:

  1. Agregar un archivo de marcador de posición en App_Data
  2. Establezca la acción de compilación en el contenido en el marcador de posición (mi archivo de marcador de posición tiene texto para que las personas que se topan con él sepan por qué está allí).
  3. Desmarque "Excluir archivos de la carpeta App_Data" en la pestaña Paquete / Publicar Web de las propiedades del proyecto en VS 2010

Esto hace que mi carpeta App_Data se cree y esté lista para su uso en el servidor. Sin embargo, esto hará que todos mis archivos se eliminen cada vez que lo publique de nuevo. Este es el problema # 2 en mi pregunta anterior, y se parece mucho a esta otra question / answer SO.

Evitar que los datos del servidor se eliminen en eventos de publicación posteriores

Hay dos mecanismos en MsDeploy que pueden confundirse (al menos yo los confundí):

  1. Excluyendo archivos
  2. MsDeploy saltar reglas

Ambos pueden usarse para resolver el problema, dependiendo del escenario:

  1. La solución de @ tdykstra probablemente funcionará si:
    1. Conozca los nombres de los archivos en App_Data por adelantado (por ejemplo, una base de datos sqllite)
    2. Tenga los archivos incluidos en la carpeta App_Data en su proyecto
  2. El uso de MsDeploy omite reglas para decirle a MsDeploy que omita completamente todas las eliminaciones en el servidor para ese directorio y los archivos en ese directorio. Esto resuelve el problema en todos los casos, pero es mucho más complicado.

Implementando MsDeploy saltar reglas

Para implementar las reglas de omisión, tendrá que abandonar el clic derecho, la opción Implementar en VS 2010 en lugar de hacer clic con el botón derecho, Empaquetar, entrar en una línea de comando, modificar un archivo de lote y ejecutar una línea de comando). Si está dispuesto a soportar esta experiencia (lo estoy, porque lo estoy automatizando todo a través de un proceso de CI), aquí están los detalles:

  1. Edite el archivo de proyecto y agregue lo siguiente . Tenga en cuenta que el argumento AbsolutePath es una expresión regular, por lo que puede obtener mucho más sofisticado:

    <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>

  2. Paquete, no implementar el proyecto. Esto creará un archivo zip y un archivo .cmd en el directorio de destino (definido por "Ubicación donde se creará el paquete" en la pestaña Paquete / Publicar Web). De forma predeterminada, esto es obj / Debug / Package (u obj / Release / Package)
  3. Implementar el sitio utilizando el archivo de comando resultante

En mis pruebas, debe empaquetar y ejecutar el archivo de comandos. Los ajustes del archivo de proyecto le indicarán a msbuild que ponga la regla de skip necesaria en el archivo de comando. Sin embargo, el uso de la función "publicar" directamente desde VS 2010 answer (vea la advertencia en este tutorial ) ... llama a msdeploy directamente y no parece cumplir con las reglas de omisión de archivos del proyecto. Creo que esta es la diferencia entre VS utilizando msbuild -T: Package y msbuild -T: MsDeployPublish para compilar el proyecto, pero no lo he probado.

Finalmente, el archivo de comandos no es del todo correcto, al menos en VS 2010 SP1. Hay una gran descripción de lo que funciona mal en esta respuesta SO , pero básicamente, VS (o quizás el / t: El objetivo del paquete es el mejor culpable) configura el archivo de comando para publicar en la máquina sin especificar un sitio. Para solucionarlo, deberá obtener de alguna manera "? Site = sitename " (probablemente se trate de? Site = Default + Web + Site, para obtener una URL completa de https: // máquina : 8172 / MsDeploy.axd? Site = Default + Web + Sitio) al final del argumento computerName.

El problema que tuve fue que el archivo de comando (archivo por lotes) tiene dificultades para usar site = anything en la línea de comandos, ya que analiza mal el argumento de la línea de comandos (incluso si se escapó). No veo otra forma de solucionar este problema que no sea modificar el archivo cmd directamente, pero para las pruebas copié la salida de msdeploy.exe que vi en mi ejecución de prueba fallida y la modifiqué para que llamara a msdeploy.exe directamente sin la secuencia de comandos.

Ahora que está funcionando, mi intención es trabajar esto en mis procesos de compilación de CI. Lo que haré para la solución final es:

  1. Cambiar mi script de compilación para usar / T: Package (ahora es / T: MsDeploy)
  2. Haga que una rutina de búsqueda / reemplazo con script modifique el script de implementación de cmd generado
  3. Ejecutar el script de implementación alterado

Esto realmente debería ser más fácil.

Actualizar

Aquí está la rutina de búsqueda / reemplazo con script que he encontrado en PowerShell:

(Get-Content "project.deploy.cmd") -replace(''^set _ArgComputerName=$'' ,"set ArgComputerName=https://server:8172/MsDeploy.axd?Site=Default+Web+Site") | Out-File -Encoding ascii deploy.cmd

Una vez que se ejecuta, se puede llamar a deploy.cmd (sin la opción / M) y funcionará como se esperaba.

Tengo una configuración de aplicación con la siguiente configuración de Paquete / Publicar Web:

  • Solo archivos necesarios para ejecutar esta aplicación
  • (sin marcar) Excluir los símbolos de depuración generados
  • (marcado) Excluir archivos de la carpeta App_Data
  • (marcado) Incluya todas las bases de datos configuradas en la pestaña Paquete / Publicar SQL - note que no tengo ninguna base de datos configurada
  • (sin marcar) incluye la configuración de IIS según lo configurado en IIS Express

En el proyecto, tengo una configuración de carpeta App_Data, principalmente para manejar los registros de aplicaciones.

El comportamiento que me gustaría ver (y esperar) es el siguiente:

  1. En la implementación inicial en un nuevo servidor, la aplicación se copia y se crea una carpeta App_Data con permisos de escritura asignados para la aplicación.
  2. En implementaciones posteriores, la carpeta App_Data se ignora porque ya existe y se comprueba "Excluir archivos de la carpeta App_Data".

Sin embargo, parece que msdeploy no realiza el paso # 1 (el paso 2 está bien si creo la carpeta manualmente). No he podido encontrar ninguna documentación en la web además de esta pregunta sin respuesta, por lo que parece confirmar el comportamiento que veo.

¿Cómo obtengo msdeploy para crear App_Data y asignar permisos en la implementación inicial en este escenario?


Logré que funcionara cuando utilizaba el cuadro de diálogo Publish Web desde Visual Studio. Nota: funciona para cualquier carpeta y no solo para App_Data .

Este es el perfil básico de .pubxml :

<?xml version="1.0" encoding="utf-8"?> <!-- This file is used by the publish/package process of your Web project. You can customize the behavior of this process by editing this MSBuild file. In order to learn more about this please visit http://go.microsoft.com/fwlink/?LinkID=208121. --> <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup> <AfterAddIisSettingAndFileContentsToSourceManifest>AddCustomSkipRules</AfterAddIisSettingAndFileContentsToSourceManifest> <WebPublishMethod>MSDeploy</WebPublishMethod> <LastUsedBuildConfiguration>Local</LastUsedBuildConfiguration> <LastUsedPlatform>Any CPU</LastUsedPlatform> <SiteUrlToLaunchAfterPublish /> <ExcludeApp_Data>False</ExcludeApp_Data> <MSDeployServiceURL>localhost</MSDeployServiceURL> <DeployIisAppPath>SuperCoolAwesomeAppName</DeployIisAppPath> <RemoteSitePhysicalPath /> <SkipExtraFilesOnServer>False</SkipExtraFilesOnServer> <MSDeployPublishMethod>InProc</MSDeployPublishMethod> <EnableMSDeployBackup>False</EnableMSDeployBackup> <UserName /> <_SavePWD>False</_SavePWD> <LaunchSiteAfterPublish>True</LaunchSiteAfterPublish> </PropertyGroup> <PropertyGroup> <UseMsDeployExe>true</UseMsDeployExe> </PropertyGroup> <Target Name="CreateEmptyFolders"> <Message Text="Adding empty folders to Files" /> <MakeDir Directories="$(_MSDeployDirPath_FullPath)/Files/Folder 1" /> <MakeDir Directories="$(_MSDeployDirPath_FullPath)/Files/Folder 2" /> <MakeDir Directories="$(_MSDeployDirPath_FullPath)/Files/Folder 3/Test"/> </Target> <Target Name="AddCustomSkipRules" DependsOnTargets="CreateEmptyFolders"> <Message Text="Adding Custom Skip Rules" /> <ItemGroup> <MsDeploySkipRules Include="SkipFilesInFilesFolder"> <SkipAction>Delete</SkipAction> <ObjectName>filePath</ObjectName> <AbsolutePath>$(_DestinationContentPath)//Files//.*</AbsolutePath> <Apply>Destination</Apply> </MsDeploySkipRules> <MsDeploySkipRules Include="SkipFoldersInFilesFolders"> <SkipAction></SkipAction> <ObjectName>dirPath</ObjectName> <AbsolutePath>$(_DestinationContentPath)//Files//.*//*</AbsolutePath> <Apply>Destination</Apply> </MsDeploySkipRules> </ItemGroup> </Target> </Project>

Aquí hay un post detallado explicándolo:

Usar MsDeploy publicar perfil .pubxml para crear una estructura de carpetas vacía en IIS y omitir la eliminación con MsDeploySkipRules


Resumiendo y simplificando las respuestas de Emil y Leniel en una concisa, si solo desea permitir el despliegue de App_Data para agregar y actualizar, pero evita eliminar, agregue esto a su .pubxml .

<Project> ... <PropertyGroup> <UseMSDeployExe>true</UseMSDeployExe> <ExcludeApp_Data>False</ExcludeApp_Data> </PropertyGroup> <Target Name="AddCustomSkipRules" AfterTargets="AddIisSettingAndFileContentsToSourceManifest"> <Message Text="Adding Custom Skip Rules" /> <ItemGroup> <MsDeploySkipRules Include="SkipDeleteAppData"> <SkipAction>Delete</SkipAction> <ObjectName>filePath</ObjectName> <AbsolutePath>App_Data//.*</AbsolutePath> </MsDeploySkipRules> <MsDeploySkipRules Include="SkipDeleteAppData"> <SkipAction>Delete</SkipAction> <ObjectName>dirPath</ObjectName> <AbsolutePath>App_Data</AbsolutePath> </MsDeploySkipRules> </ItemGroup> </Target> </Project>

<UseMSDeployExe>true</UseMSDeployExe> es realmente necesario o fallará en quejarse de la Unrecognized skip directive ''skipaction'' no Unrecognized skip directive ''skipaction'' .


Web Deploy no creará una carpeta si no hay archivos para copiar en ella. Una solución alternativa en su escenario sería no usar la casilla de verificación Excluir archivos de la carpeta App_Data , poner un archivo ficticio en App_Data (como un archivo .txt sin nada) y especificar reglas de exclusión de archivos para cualquier otra cosa que tenga la carpeta App_Data (como su archivo .sdf).

Al excluir archivos individuales (puede usar comodines), vea la primera pregunta en las preguntas frecuentes de implementación en MSDN:

http://msdn.microsoft.com/en-us/library/ee942158.aspx#can_i_exclude_specific_files_or_folders_from_deployment

Sobre el uso del método de archivo ficticio para crear una carpeta, consulte Asegurarse de que la carpeta Elmah se despliegue en este tutorial:

http://www.asp.net/web-forms/tutorials/deployment-to-a-hosting-provider/deployment-to-a-hosting-provider-configuring-project-properties-4-of-12