Faire MSDeploy (Visual Studio) ne pas supprimer le dossier des données de L'application, mais supprimer tout le reste

J'utilise le bouton Publish de Visual Studio pour déployer mon site web, et je veux un dossier App_Data différent sur le serveur. Il y a une case à cocher pour Leave extra files on destination (do not delete) qui empêche mon dossier App_Data d'être supprimé, mais il finira par accumuler beaucoup de fichiers vestigiaux que le site Web change.

y a-t-il un moyen de le faire exclure juste App_Data quand il supprime tout?

54
demandé sur Rei Miyasaka 2010-11-27 03:35:32

5 réponses

cela peut être fait lorsque vous invoquez msdeploy manuellement - il suffit d'ajouter le paramètre suivant:

-skip:Directory=\App_Data

Voir Web Déployer Les Paramètres De L'Opération . Le chemin est une expression régulière, il est donc assez souple.

si vous utilisez le nom de projet généré par VS.déployer.cmd script, vous pouvez également passer ce paramètre dans la variable D'environnement _MsDeployAdditionalFlags (lorsque vous exécutez ce script).

C'est le meilleur que j'ai trouvé pour nos besoins (nous avons une situation similaire à celle que vous). Je n'ai pas essayé de l'intégrer avec le bouton Publier de VS, depuis que nous nous déployons à partir de la ligne de commande.

EDIT:

j'ai appris quelques choses sur MSDeploy depuis que j'ai posté cette réponse, donc j'ai pensé que je voudrais la mettre à jour maintenant.

tout d'abord, la règle skip ci-dessus passe à côté de toutes les opérations sur le chemin correspondant (App_Data). Si un contrôle plus granulaire est nécessaire, une syntaxe plus verbeuse est disponible. Par exemple, pour sauter seulement les suppressions (pour garder n'importe quels dossiers supplémentaires sur le serveur cible, mais ajouter n'importe quels nouveaux et mettre à jour ceux existants):

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

cette option supprime tous les fichiers et tous les sous-dossiers (avec tout leur contenu) dans App_Data, mais n'empêche pas les ajouts et les mises à jour.

une autre chose utile est que les règles de saut peuvent être définies dans le dossier de projet ( .csproj ) de sorte qu'ils soient automatiquement inclus dans le script .deploy.cmd généré avec le paquet. Cela rend inutile de les passer au script par _MsDeployAdditionalFlags.

la règle de saut ci-dessus sera ajoutée si ce qui suit est inclus dans le fichier csproj :

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

(les noms AddCustomSkipRules et SkipDeleteAppData sont complètement arbitraires; $(_Escaped_PackageTempDir) est supposé être peut-être nécessaire, mais dans la pratique je l'ai toujours vu évaluer à une corde vide)

Voir Web Deploy: Personnalisation d'un package de déploiement et Comment définir MSDeploy paramètres .csproj file pour plus d'information.

une mise en garde: cela ajoute seulement ces règles au script .deploy.cmd , il est donc inutile si vous voulez utiliser le gestionnaire graphique IIS pour le déploiement du paquet, car il n'utilise pas ce script (la même chose probablement va pour le déploiement de VS, mais je n'ai pas vérifié).

90
répondu Jakub Januszkiewicz 2017-05-23 11:54:05

avez-vous regardé Package/Publish Web dans les paramètres du projet, parce que vous pouvez lui dire d'exclure des fichiers dans le dossier App_Data.

1
répondu Bob Vale 2011-10-20 18:06:12

d'après mon expérience, MsDeploySkipRules ne sont lancés que lors d'un déploiement à partir de la ligne de commande.

si vous publiez de Visual Studio à Azure (ou en utilisant une autre méthode de déploiement Web), vous pouvez définir ce qui suit lors de la publication.

  • supprimer les fichiers supplémentaires à destination
  • exclure les fichiers du dossier App_Data

lorsque" supprimer les fichiers supplémentaires à destination " est coché, il fera une comparaison entre les fichiers et dossiers que vous déployez et ceux du serveur.

soyez averti, vous pouvez rencontrer des problèmes si vous avez du contenu généré par L'utilisateur, par exemple des téléchargements. Mais cela pourrait être contourné en stockant ces dossiers dans un endroit différent, par exemple stockage S3 / Azure.

Web Publishing Profile

0
répondu uniquelau 2018-02-07 13:22:06

ce n'est pas idéal puisque vous pouvez copier beaucoup de fichiers faisant cela (je ne le suis pas), Mais voici ma solution pour sauvegarder un dossier. Adapté pour déplacer le dossier à l'emplacement à partir duquel il sera publié, pendant le processus de publication. Mettez ceci dans votre fichier pubxml:

<Project>
...
<Target Name="PreserveSelectedFolder" AfterTargets="GatherAllFilesToPublish">
   <ItemGroup>
     <SITEDIR Include="$(publishUrl)\App_Data\**\*.*" />
   </ItemGroup>
   <Copy SourceFiles="@(SITEDIR)" 
      DestinationFolder="$(ProjectDir)\obj$(Configuration)\Package\PackageTmp\%(RecursiveDir)"></Copy>
</Target>
</Project>

et si vous voulez juste faire n'importe quel nombre de dossiers connus spécifiques, faites un bloc de copie par dossier:

<Target Name="PreserveSelectedFiles" AfterTargets="GatherAllFilesToPublish"  >
    <Copy SourceFiles="$(publishUrl)\MYFILENAME.EXT" 
      DestinationFolder="$(ProjectDir)\obj$(Configuration)\Package\PackageTmp\" 
      Condition="Exists('$(publishUrl)\MYFILENAME.EXT')"></Copy>
</Target>
0
répondu Brett Lalonde 2018-08-29 19:46:10

mettez ceci dans votre fichier pubxml:

<ExcludeApp_Data>True</ExcludeApp_Data>
-1
répondu pipll 2018-09-26 04:42:34