web-dev-qa-db-fra.com

Comment faire en sorte que la fonctionnalité 'Publish' de Visual Studio inclue des fichiers issus d'un événement postérieur à la construction?

J'essaie actuellement d'utiliser les fonctionnalités de publication et MSDeploy de Visual Studio 2010 pour répondre à mes besoins de déploiement Web, mais j'ai rencontré un problème en ce qui concerne la personnalisation du package en fonction de ma configuration de génération.

Je développe dans un environnement 32 bits, mais j'ai besoin de créer un package de version pour un environnement 64 bits. Ainsi, dans la configuration 'Release', j'ai un événement post-build qui copie la version 64 bits d'une DLL tierce dans le répertoire bin en écrasant la version 32 bits . Lorsque j'utilise la fonctionnalité 'Publier', même si la dll 64 bits correcte est copiée dans le répertoire bin, elle n'est pas incluse dans le package.

Existe-t-il un moyen d'obtenir que la publication publie les fichiers qui ont été copiés dans le répertoire bin lors d'un événement post-génération?

85
brodie

J'ai répondu à une question similaire mais différente sous Comment inclure des fichiers supplémentaires à l'aide de packages de déploiement Web VS2010? .

Dans votre scénario, vous utilisez un événement post-build, je vous recommande de supprimer l'événement post-build et de mettre en œuvre vos actions en utilisant vos propres cibles MSBuild au lieu d'un événement post-build. Vous trouverez ci-dessous le texte de l'autre réponse.


De: Comment inclure des fichiers supplémentaires à l'aide de packages de déploiement Web VS2010?


Excellente question. Je viens de publier une entrée de blog très détaillée à ce sujet sur Outil de déploiement Web (MSDeploy): package de création comprenant des fichiers supplémentaires ou excluant des fichiers spécifiques .

Voici le synopsis. Après avoir inclus les fichiers, je montre également comment exclure des fichiers.

Y compris les fichiers supplémentaires

L'inclusion de fichiers supplémentaires dans le paquet est un peu plus difficile, mais cela ne pose aucun problème si vous êtes à l'aise avec MSBuild et si vous ne l'êtes pas, lisez ceci. Pour ce faire, nous devons intégrer la partie du processus qui collecte les fichiers pour l’emballage. La cible à étendre est appelée CopyAllFilesToSingleFolder. Cette cible a une propriété de dépendance, PipelinePreDeployCopyAllFilesToOneFolderDependsOn, dans laquelle nous pouvons puiser et injecter notre propre cible. Nous allons donc créer une cible nommée CustomCollectFiles et l'injecter dans le processus. Nous y parvenons comme suit (rappelez-vous après la déclaration d'importation).

<PropertyGroup>
  <CopyAllFilesToSingleFolderForPackageDependsOn>
    CustomCollectFiles;
    $(CopyAllFilesToSingleFolderForPackageDependsOn);
  </CopyAllFilesToSingleFolderForPackageDependsOn>
</PropertyGroup>

Cela ajoutera notre cible au processus. Nous devons maintenant définir la cible elle-même. Supposons que vous avez un dossier nommé Extra Files qui se situe 1 niveau au-dessus de votre projet Web. Vous voulez inclure tous ces fichiers. Voici la cible CustomCollectFiles et nous en discutons par la suite.

<Target Name="CustomCollectFiles">
  <ItemGroup>
    <_CustomFiles Include="..\Extra Files\**\*" />

    <FilesForPackagingFromProject  Include="%(_CustomFiles.Identity)">
      <DestinationRelativePath>Extra Files\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
    </FilesForPackagingFromProject>
  </ItemGroup>
</Target>

Ici, j'ai créé l'élément _CustomFiles et, dans l'attribut Inclure, lui a demandé de récupérer tous les fichiers de ce dossier et de tous les dossiers situés en dessous. Ensuite, j'utilise cet élément pour renseigner l'élément FilesForPackagingFromProject. C'est l'élément que MSDeploy utilise réellement pour ajouter des fichiers supplémentaires. Notez également que j'ai déclaré la valeur de métadonnées DestinationRelativePath. Cela déterminera le chemin relatif dans lequel il sera placé. J'ai utilisé l'instruction Extra Files% (RecursiveDir)% (Filename)% (Extension) ici. Cela dit, placez-le dans le même emplacement relatif dans le package que dans le dossier Extra Files.

Fichiers exclus

Si vous ouvrez le fichier de projet d'une application Web créée avec VS 2010 au bas de celui-ci, vous trouverez une ligne avec.

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />

En passant, vous pouvez ouvrir le fichier de projet dans VS. Cliquez avec le bouton droit sur la sélection de projet Décharger le projet. Cliquez ensuite avec le bouton droit sur le projet non chargé et sélectionnez Modifier le projet.

Cette déclaration inclura toutes les cibles et tâches dont nous avons besoin. La plupart de nos personnalisations devraient être faites après cette importation, si vous n'êtes pas sûr de les mettre si après! Donc, si vous avez des fichiers à exclure, vous pouvez utiliser un nom d’élément, ExcludeFromPackageFiles. Par exemple, disons que vous avez un fichier nommé Sample.Debug.js qui a été inclus dans votre application Web mais que vous voulez que ce fichier soit exclu des packages créés. Vous pouvez placer l'extrait ci-dessous après cette instruction d'importation.

<ItemGroup>
  <ExcludeFromPackageFiles Include="Sample.Debug.xml">
    <FromTarget>Project</FromTarget>
  </ExcludeFromPackageFiles>
</ItemGroup>

En déclarant remplir cet élément, les fichiers seront automatiquement exclus. Notez l'utilisation des métadonnées FromTarget ici. Je n'entrerai pas dans les détails ici, mais vous devriez savoir de toujours le préciser.

82

J'ai trouvé une solution de contournement au problème en utilisant l'élément ExcludeFilesFromDeployment dans le fichier de projet. J'ai eu l'idée de Déploiement Web: Exclure des fichiers et des dossiers

Ainsi, si vous devez regrouper les fichiers de projet tels qu’ils existent dans votre répertoire de projet après une construction réussie et les étapes de post-génération associées, procédez comme suit.

  1. Modifiez les paramètres du projet "Package/Publish Web" et
    sélectionnez les éléments à déployer pour être "Tous les fichiers dans ce dossier de projet" 
  2. Décharger le projet 
  3. Cliquez avec le bouton droit sur le projet non chargé et sélectionnez pour modifier la configuration du projet. 
  4. Localisez l'élément PropertyGroup associé au paramètre de configuration, par exemple. "Libération"
  5. Dans l'élément PropertyGroup, ajoutez les éléments suivants et excluez les fichiers et les dossiers que vous ne souhaitez pas inclure dans le package.

    <ExcludeFilesFromDeployment>*.cs;**\.svn\**\*.*;Web.*.config;*.csproj*</ExcludeFilesFromDeployment>
    <ExcludeFoldersFromDeployment>.svn;Controllers;BootstrapperTasks;Properties</ExcludeFoldersFromDeployment>
    
  6. Sauvegarder et recharger votre projet

Cela résout mon problème pour le moment, mais s'il existe une meilleure solution, merci de me le faire savoir, car ce n'est pas idéal en raison du piratage informatique impliqué, mais encore une fois, il s'agit peut-être d'un scénario de déploiement inhabituel?

12
brodie

Sélectionnez vos fichiers ou dossiers et modifiez l'action de construction en tant que contenu à partir de la fenêtre Propriétés.

4
Gomes

Je sais que c'est une vieille question, mais aucune de celles-ci n'a fonctionné pour moi. 

En 2017, j'ai juste cliqué avec le bouton droit sur le dossier supplémentaire à publier et sélectionnez Publier cela a fonctionné. 

Exemple: 

 enter image description here

1
user2695433

Je sais que c’est une vieille conversation, mais j’y suis arrivée en essayant de faire la même chose et j’ai pensé qu’il serait utile d’ajouter ce que j’ai trouvé ici.

Presque tous les articles sur l'inclusion de fichiers supplémentaires dans votre publication utilisent cette méthode pour ajouter les éléments CopyAllFilesToSingleFolderForPackageDependsOn ou CopyAllFilesToSingleFolderForMSDeployDependsOn dans la PropertyGroup et ils ont tous le même contenu, comme "J'ai ajouté ceci à la fin du fichier ...".

C'est ce que j'ai fait et passé un après-midi à essayer de comprendre pourquoi rien ne se passait jusqu'à ce que je réalise qu'il y avait déjà une section PropertyGroup en haut du fichier. Lorsque j’ai mis ma CopyAllFilesToSingleFolderForPackageDependsOn dans cette section, cela a bien fonctionné.

J'espère que cela économise du temps à quelqu'un un jour

0
john.gleeson

L'ajout du dossier bin (et de son contenu) au projet a entraîné la copie des fichiers dans le répertoire de sortie de publication.

Pour moi, le problème était que je devais placer un fichier de licence de logiciel propriétaire dans le dossier bin /, mais je ne voulais pas le copier manuellement à chaque déploiement.

Cela utilisait Visual Studio 2015 Professional

0
James Wierzba