57 votes

Faire en sorte que MSDeploy (Visual Studio) ne supprime pas le dossier App_Data mais supprime tout le reste.

J'utilise l'outil de Visual Studio Publish 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) ce qui empêche mon dossier App_Data d'être supprimé, mais il finira par accumuler beaucoup de fichiers vestigiaux au fur et à mesure que le site web change.

Y a-t-il un moyen de faire en sorte qu'il exclue seulement App_Data quand il supprime tout ?

101voto

Jakub Januszkiewicz Points 2120

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

-skip:Directory=\\App_Data

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

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

C'est ce que j'ai trouvé de mieux pour nos besoins (nous avons une situation similaire à la vôtre). Je n'ai pas essayé de l'intégrer avec le bouton Publish de VS, puisque nous déployons à partir de la ligne de commande.

EDITAR:

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

Tout d'abord, la règle de saut ci-dessus saute 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 ignorer uniquement les suppressions (pour conserver tout fichier supplémentaire sur le serveur cible, mais ajouter tout nouveau fichier et mettre à jour les fichiers existants) :

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

Cela évite la suppression 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'ils soient automatiquement inclus dans le .deploy.cmd script généré avec le paquet. Il n'est donc pas nécessaire de les transmettre au script par le biais de _MsDeployAdditionalFlags.

La règle de saut ci-dessus sera ajoutée si l'élément suivant est inclus dans le fichier csproj fichier :

<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 y SkipDeleteAppData sont complètement arbitraires ; $(_Escaped_PackageTempDir) est censé être éventuellement nécessaire, mais en pratique, j'ai toujours vu qu'il était évalué à une chaîne vide)

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

Une mise en garde : cela n'ajoute que ces règles à la base de données de l .deploy.cmd script, donc il est inutile si vous voulez utiliser le gestionnaire graphique IIS pour le déploiement de paquets, car il n'utilise pas ce script (il en va probablement de même pour le déploiement à partir de VS, mais je n'ai pas vérifié).

0 votes

Génial ! J'avais même été sur cette page MS et ne l'avais pas trouvée.

10 votes

Pour que cela fonctionne lors du déploiement via la fonction "Publish" de Visual Studio, il faut utiliser AfterAddIisSettingAndFileContentsToSourceManifest au lieu de OnBeforePackageUsingManifest . Voir commentaire blog.alanta.nl/2011/02/

1 votes

Dans mon cas, c'était particulièrement utile parce que je déployais le site Root, et non une application à l'intérieur de celui-ci, et j'avais donc besoin de -skip:Directory=\\aspnet_client . Cela a marché comme un charme.

2voto

uniquelau Points 423

D'après mon expérience, MsDeploySkipRules ne sont exécutées 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 à la destination
  • Exclure les fichiers du dossier App_Data

Lorsque l'option "Supprimer les fichiers supplémentaires à la destination" est cochée, une comparaison est effectuée entre les fichiers et dossiers que vous déployez et ceux qui se trouvent sur le serveur.

Attention, 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 peut être contourné en stockant ces dossiers dans un autre emplacement, par exemple S3 / Azure Storage.

Web Publishing Profile

2voto

lef Points 23

À partir de Powershell, si vous voulez utiliser msdeploy.exe ou le fichier myproj.deploy.cmd ( Déploiement de paquets Web ) produit lors de la publication avec Web Deploy Package, afin d'éviter de supprimer le dossier App_Data et d'éviter le message d'erreur

All arguments must begin with "-"

vous devez placer la directive "skip" entre des guillemets triples, par exemple :

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

1voto

Guido Neele Points 163

Pour les applications web asp.net core, 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>

Remplacer <dir_name> avec votre dossier racine

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

1voto

Bob Vale Points 11355

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

1 votes

J'ai essayé cela, mais cela ne fonctionne pas. Il essaie toujours de supprimer le dossier lors de la publication

0 votes

Bonjour, Lorsque j'utilise slowcheetah, même si nous mettons exludefilesfromdeployment, cela ne supprime pas le fichier.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X