Comment obtenir la fonctionnalité «Publier» de Visual Studio pour inclure des fichiers à partir d'un événement post-build?


89

J'essaie actuellement d'utiliser les fonctionnalités «Publier» et MSDeploy de Visual Studio 2010 pour gérer mes besoins de déploiement Web, mais j'ai rencontré un obstacle en ce qui concerne la personnalisation du package en fonction de ma configuration de build.

Je développe dans un environnement 32 bits mais je dois créer un package de version pour un environnement 64 bits, donc 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 le 'Publier' pour inclure les fichiers qui ont été copiés dans le répertoire bin lors d'un événement post build?


1
Si vous utilisez un événement de pré- génération à la place, cela semble fonctionner comme vous le souhaitez déjà (Visual Studio 2013, modèle de projet ASP.NET).
bzlm

Ils semblent avoir supprimé le comportement prédéfini mentionné dans le commentaire ci-dessus dans Visual Studio 2015 et versions ultérieures.
justdan23

Réponses:


91

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

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


De: Comment inclure des fichiers supplémentaires à l'aide des 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 Web Deployment Tool (MSDeploy): Build Package comprenant des fichiers supplémentaires ou excluant des fichiers spécifiques .

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

Y compris des fichiers supplémentaires

L'inclusion de fichiers supplémentaires dans le package est un peu plus difficile mais toujours pas grave si vous êtes à l'aise avec MSBuild, et si vous ne l'êtes pas, lisez ceci. Pour ce faire, nous devons nous connecter à la partie du processus qui collecte les fichiers pour l'empaquetage. La cible que nous devons é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 avec ce qui 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 ayez un dossier nommé Extra Files qui se trouve 1 niveau au-dessus de votre projet Web. Vous souhaitez inclure tous ces fichiers. Voici la cible CustomCollectFiles et nous en discuterons après.

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

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

Ici, ce que j'ai fait a été de créer l'élément _CustomFiles et dans l'attribut Inclure, je lui ai dit de récupérer tous les fichiers de ce dossier et de tout dossier en dessous. Ensuite, j'utilise cet élément pour remplir 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 DestinationRelativePath des métadonnées. Cela déterminera le chemin relatif dans lequel il sera placé dans le package. J'ai utilisé l'instruction Extra Files% (RecursiveDir)% (Filename)% (Extension) ici. Ce que cela signifie est de le placer dans le même emplacement relatif dans le package que sous le dossier Extra Files.

Exclure des fichiers

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

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

BTW, vous pouvez ouvrir le fichier de projet à l'intérieur de VS. Cliquez avec le bouton droit sur le projet Choisissez Décharger le projet. Cliquez ensuite avec le bouton droit sur le projet déchargé et sélectionnez Modifier le projet.

Cette déclaration comprendra tous les objectifs et tâches dont nous avons besoin. La plupart de nos personnalisations devraient être après cette importation, si vous n'êtes pas sûr de les mettre après! Donc, si vous avez des fichiers à exclure, il existe un nom d'élément, ExcludeFromPackageFiles, qui peut être utilisé pour le faire. Par exemple, disons que vous avez un fichier nommé Sample.Debug.js qui est inclus dans votre application Web mais que vous souhaitez 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 cela ici, mais vous devriez savoir de toujours le préciser.


1
Merci Sayed, bien que ce ne soit pas la méthode la plus simple, je suppose que c'est ainsi que cela se fait.
brodie

8
@Dit, cela ne semble pas fonctionner pour VS2012, savez-vous comment cela peut être mis à jour pour ce scénario. le passage à la v11.0 ne fonctionne pas. TIA.
Simon Francesco

2
@Daniel Si vous avez juste besoin de fichiers spécifiques et non d'un dossier, modifiez simplement les _CustomFiles pour inclure ces fichiers spécifiques au lieu de les ajouter récursivement avec ***. Donc, quelque chose comme <_CustomFiles Include = ".. \ Dependencies \ FileA.dll" /> <_ CustomFiles Include = "C: \ Someotherplace \ FileB.txt" /> Quelque chose de similaire.
bwerks

3
@SimonFrancesco J'ai également vécu cela, et le changement nécessaire semble avoir été d'étendre <CopyAllFilesToSingleFolderForMsdeployDependsOn> plutôt que <CopyAllFilesToSingleFolderForPackageDependsOn> comme écrit dans la réponse ci-dessus.
bwerks


13

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

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

  1. Modifiez les paramètres du projet "Package / Publier le Web" et
    sélectionnez "Tous les fichiers de ce dossier de projet".
  2. Déchargez le projet
  3. Faites un clic droit sur le projet déchargé et sélectionnez pour modifier la configuration du projet
  4. Localisez l' PropertyGroupélément associé au paramètre de configuration, par exemple "Release"
  5. Dans l' PropertyGroupélément, ajoutez les éléments suivants et excluez les fichiers et dossiers que vous ne voulez pas dans le package

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

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


6

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


1
Bien, mais en plus vous devez sélectionner "Copier si plus récent" ou "Copier toujours", car sinon l'action par défaut est "Ne pas copier", même si "Contenu" est sélectionné.
Matt

1
d'accord avec matt pour une étape supplémentaire
Gomes

7
Aucune action de construction n'existe pour les dossiers (VS2013)
Cristian E.

copytooutputdirectory = Copier toujours
Gomes

A travaillé même sans Copy Always.
Tengiz

3

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

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

Exemple:

entrez la description de l'image ici


Bien que ce soit une toute petite étape supplémentaire, c'est très simple.
Ciaran Gallagher

0

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

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

Cela utilisait Visual Studio 2015 Professional


0

Je sais que c'est une vieille conversation mais je suis tombé dessus 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 composition utilisent cette méthode pour ajouter les éléments CopyAllFilesToSingleFolderForPackageDependsOnou CopyAllFilesToSingleFolderForMSDeployDependsOndans le PropertyGroupet ils ont tous la même chose comme "J'ai ajouté ceci à la fin du fichier ..."

C'est ce que j'ai fait et j'ai passé un après-midi à essayer de trouver pourquoi rien ne se passait jusqu'à ce que je réalise qu'il y avait déjà une PropertyGroupsection en haut du dossier. Quand j'ai mis mon CopyAllFilesToSingleFolderForPackageDependsOndans cette section, cela a bien fonctionné.

J'espère que cela fera gagner du temps à quelqu'un un jour

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.