Assurez-vous que MSDeploy (Visual Studio) ne supprime pas le dossier App_Data mais supprime tout le reste

StackOverflow https://stackoverflow.com/questions/4289440

Question

J'utilise Visual Studio Publish bouton pour déployer mon site Web et souhaitez un dossier App_Data différent sur le serveur.Il y a une case à cocher pour Leave extra files on destination (do not delete) ce qui empêche la suppression de mon dossier App_Data, mais il finira par accumuler de nombreux fichiers résiduels à mesure que le site Web change.

Existe-t-il un moyen de lui faire exclure uniquement App_Data lorsqu'il supprime tout ?

Était-ce utile?

La solution

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

-skip:Directory=\\App_Data

Voir Web des paramètres de déploiement d'opération . Le chemin est une expression régulière, il est donc tout à fait flexible.

Si vous déployez à l'aide du script ProjectName.deploy.cmd VS généré, vous pouvez également passer ce paramètre dans la variable d'environnement _MsDeployAdditionalFlags (lors de l'exécution de ce script).

Ceci est le meilleur que je suis venu avec pour nos besoins (nous avons une situation similaire que vous). Je ne l'ai pas essayé l'intégrer avec le bouton Publier de VS, puisque nous déployons de la ligne de commande.

EDIT:

J'ai appris quelques petites choses sur MSDeploy depuis que j'ai posté cette réponse, donc je pensais que je mettre à jour maintenant.

Tout d'abord, la règle de saut saute au-dessus de toutes les opérations sur le trajet d'adaptation (App_Data). Si un contrôle plus granulaire est nécessaire, une syntaxe plus bavard est disponible. Par exemple, pour ignorer que les suppressions (pour conserver des fichiers supplémentaires sur le serveur cible, mais en ajouter d'autres et mettre à jour ceux qui existent déjà):

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

Ce Saute de tous les fichiers supprime et tous les sous-dossiers (avec tout leur contenu) dans App_Data, mais ne l'empêche pas et ajoute des mises à jour.

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

La règle de saut ci-dessus sera ajouté si le suivant 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 tout à fait arbitraire, $(_Escaped_PackageTempDir) est censé être peut nécessaires, mais en pratique, je l'ai toujours vu évaluer une chaîne vide)

Voir Web Déploiement: Personnalisation d'un package de déploiement et Comment définir les paramètres MSDeploy dans .csproj fichier pour plus info.

Une mise en garde: cela ne fait qu'ajouter ces règles au script .deploy.cmd, il est donc inutile si vous souhaitez utiliser le Gestionnaire des services Internet graphique pour le déploiement de package, car il n'utilise pas ce script (en va de même probablement pour le déploiement de VS , mais je n'ai pas vérifié).

Autres conseils

Avez-vous regardé Package / Publication Web dans les paramètres du projet, parce que vous pouvez le dire aux fichiers exlude dans le dossier App_Data.

De Powershell, si vous souhaitez utiliser msdeploy.exe ou myproj.deploy.cmd ( déploiement de packages Web ) produits lors de la publication avec le Web déploiement de paquet, afin de sauter la suppression du dossier App_Data et éviter les

All arguments must begin with "-"

erreur, vous devez joindre la directive de saut entre guillemets triples, par exemple :

myproj.deploy.cmd /y /u:myusername /p:mypass """-skip:Directory=\\App_Data"""

Selon mon expérience, MsDeploySkipRules ne sont exécutés que lors du déploiement à partir de la ligne de commande.

Si vous publiez depuis Visual Studio vers Azure (ou si vous utilisez une autre méthode Web Deploy), vous pouvez définir les éléments suivants 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é, une comparaison sera effectuée entre les fichiers et dossiers que vous déployez et ceux sur le serveur.

Soyez averti, vous pouvez rencontrer des problèmes si vous disposez de contenu généré par l'utilisateur, par ex.Téléchargements.Mais cela pourrait être contourné en stockant ces dossiers dans un emplacement différent, par ex.Stockage S3/Azure.

Web Publishing Profile

Ce n'est pas idéal puisque vous pouvez copier beaucoup de fichiers faisant cela (je ne suis pas), mais voici ma solution pour la sauvegarde d'un dossier. Adapté pour déplacer le dossier à l'emplacement où il sera publié, au cours du processus de publication. Mettez 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 un certain nombre de fichiers connus spécifiques, faire un bloc de copie par fichier:

<Target Name="PreserveSelectedFiles" AfterTargets="GatherAllFilesToPublish"  >
    <Copy SourceFiles="$(publishUrl)\MYFILENAME.EXT" 
      DestinationFolder="$(ProjectDir)\obj\$(Configuration)\Package\PackageTmp\" 
      Condition="Exists('$(publishUrl)\MYFILENAME.EXT')"></Copy>
</Target>

web noyau asp.net applications MsDeploySkipRules utilisation dans csproj.

<ItemGroup>
  <MsDeploySkipRules Include="CustomSkipFile">
    <ObjectName>filePath</ObjectName>
    <AbsolutePath><dir_name>\\app_data</AbsolutePath>
  </MsDeploySkipRules>
  <MsDeploySkipRules Include="CustomSkipFile">
    <ObjectName>dirPath</ObjectName>
    <AbsolutePath><dir_name>\\app_data</AbsolutePath>
  </MsDeploySkipRules>
</ItemGroup>

Remplacez <dir_name> votre dossier racine

https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/visual-studio-publish-profiles?view=aspnetcore-2.1#exclude-files

Mettez dans votre fichier pubxml:

<ExcludeApp_Data>True</ExcludeApp_Data>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top