web-dev-qa-db-fra.com

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

J'utilise le bouton Publish de Visual Studio pour déployer mon site Web et je souhaite un autre dossier App_Data sur le serveur. Il existe une case à cocher pour Leave extra files on destination (do not delete) qui empêche la suppression de mon dossier App_Data, mais elle finira par accumuler de nombreux fichiers restants à mesure que le site Web change.

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

55
Rei Miyasaka

Cela peut être fait lorsque vous appelez manuellement msdeploy - ajoutez simplement le paramètre suivant:

-skip:Directory=\\App_Data

Voir Paramètres de fonctionnement de Web Deploy . Le chemin est une expression régulière, il est donc assez flexible.

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

C’est ce que je propose de mieux pour nos besoins (la situation est semblable à celle que vous avez). Je n'ai pas essayé de l'intégrer avec le bouton Publier de VS, car nous déployons depuis la ligne de commande.

MODIFIER:

Depuis que j'ai posté cette réponse, j'ai appris quelques choses sur MSDeploy. Je pensais donc la mettre à jour maintenant.

Tout d’abord, la règle de saut ci-dessus ignore toutes les opérations sur le chemin correspondant (App_Data). Si un contrôle plus granulaire est nécessaire, une syntaxe plus détaillée est disponible. Par exemple, pour ignorer uniquement les suppressions (pour conserver les fichiers supplémentaires sur le serveur cible, mais en ajouter de nouveaux et mettre à jour les fichiers existants):

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

Cela ignore les suppressions de tous les fichiers et de 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 fichier de projet (.csproj) afin qu’elles soient automatiquement incluses dans le script .deploy.cmd généré avec le package. Cela rend inutile de les transmettre au script via _MsDeployAdditionalFlags.

La règle de saut ci-dessus sera ajoutée si les éléments suivants sont 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 éventuellement nécessaire, mais en pratique, je l'ai toujours vu évalué à une chaîne vide)

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

Une mise en garde: cela n’ajoute que ces règles au script .deploy.cmd; il est donc inutile si vous souhaitez utiliser le gestionnaire graphique IIS pour le déploiement de packages, car il n’utilise pas ce script VS, mais je n'ai pas vérifié).

92

Avez-vous consulté Package/Publish Web dans les paramètres du projet, car vous pouvez lui indiquer d'exclure des fichiers du dossier App_Data.

1
Bob Vale

Ce n'est pas idéal car vous copiez peut-être beaucoup de fichiers en procédant ainsi (mais ce n'est pas mon cas), mais voici ma solution pour sauvegarder un dossier. Adapté pour déplacer le dossier vers 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 créer un nombre quelconque de fichiers spécifiques, faites 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>
0
Brett Lalonde

D'après mon expérience, MsDeploySkipRules sont uniquement exécutés lors du déploiement à partir de la ligne de commande.

Si vous publiez à partir de Visual Studio vers Azure (ou utilisez une autre méthode Web Deploy), vous pouvez définir les éléments suivants lors de la publication.

  • Supprimer des fichiers supplémentaires à la destination
  • Exclure des fichiers du dossier App_Data

Lorsque la case "Supprimer les fichiers supplémentaires à la destination" est cochée, une comparaison sera établie entre les fichiers et les 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. Uploads. Mais cela pourrait être contourné en stockant ces dossiers dans un emplacement différent, par exemple. Stockage S3/Azure.

 Web Publishing Profile

0
uniquelau

Dans Powershell, si vous souhaitez utiliser msdeploy.exe ou le fichier myproj.deploy.cmd ( Déploiement de packages Web ) généré lors de la publication avec Web Deploy Package, afin de ne pas supprimer le dossier App_Data et d'éviter

All arguments must begin with "-"

erreur, vous devez inclure la directive de saut entre guillemets, par exemple. :

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

Pour les applications Web principales asp.net, utilisez MsDeploySkipRules 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> par votre dossier racine

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

0
Guido Neele