web-dev-qa-db-fra.com

Après l'événement de publication dans Visual Studio

J'essaie d'invoquer une tâche simple après un événement de publication. Quand je dis "publier", je veux dire publier dans Visual Studio, cliquer avec le bouton droit de la souris sur le projet et appuyer sur "Publier ...". J'ai inclus le fichier de cibles (importé) dans le fichier de projet, ce qui fonctionne bien car je l'ai déjà testé sur l'événement Build. J'ai trouvé sur http://msdn.Microsoft.com/en-us/library/ms366724.aspx qu'il existe un événement AfterPublish qui devrait suffire, mais ce n'est pas le cas. Je ne suis pas sûr qu'il s'agisse du même événement qui devrait déclencher la publication dans Visual Studio, veuillez clarifier cela. Ma question est de savoir comment déclencher tout type de tâche à partir du fichier de cibles sur Publier dans Visual Studio?

J'ai essayé ceci dans le fichier des cibles:

<Project xmlns="http://schemas.Microsoft.com/developer/msbuild/2003">
    <Target Name="AfterPublish">
        <Message Label="Test"></Message>        
        <Warning Label="Test"></Warning>
    </Target>   
</Project>

J'utilise Visual Studio 2010.

MODIFIER:

Je cherche actuellement un moyen quelconque d'exécuter certaines actions sur Publier dans Visual Studio. Je pensais également à l'ajout d'événements de construction, mais je ne sais pas comment déterminer s'il est en cours de publication ou non.

EDIT: @Alexey Shcherbak merci pour votre réponse rapide. Je reçois ceci dans ma sortie MSBuild:

12/10/2012 12:29:40 AM:        Done executing task "CallTarget".
12/10/2012 12:29:40 AM:        Done building target "PipelinePreDeployCopyAllFilesToOneFolder" in project "PublishTestApp.csproj".
12/10/2012 12:29:40 AM:Done building project "PublishTestApp.csproj".
Deleting existing files...
Publishing folder /...
Publishing folder Account...
Publishing folder bin...
Publishing folder Scripts...
Publishing folder Styles...
========== Build: 1 succeeded or up-to-date, 0 failed, 0 skipped ==========
========== Publish: 1 succeeded, 0 failed, 0 skipped ==========

Donc, ma tâche sera exécutée juste après PipelinePreDeployCopyAllFilesToOneFolder mais avant la copie effective des fichiers et je ne considère pas que la publication soit encore effectuée à ce stade. Bien sûr, j’ai effectivement testé cela; c’est pourquoi, dans la tâche MSBuild, j’exécutais une lecture simple à partir d’un fichier texte censé être copié dans le dossier Publier, et cela a échoué.

22
Andrija Cacanovic

Le menu contextuel de publication n'utilise pas la cible "Publier" (si nous parlons de publication de site Web, pas de publication du package ClickOnce).

Si vous utilisez VS2010 - le menu contextuel exécutera la cible "PipelinePreDeployCopyAllFilesToOneFolder" et dans VS2012 (gardez cela à l'esprit si vous envisagez de changer), il exécutera la cible "MSDeployPublish".

Je suppose que vous devriez lire cette question et cette réponse . Jez et moi avons fourni une réponse assez complète sur la manière d’attacher la cible Avant\Après la publication.

En bref - pour MSBuild version> = 4.0, vous pouvez utiliser cette approche

<Target Name="Mytarget" AfterTargets="PipelinePreDeployCopyAllFilesToOneFolder" >
    <Message Label="Test"></Message>        
    <Warning Label="Test"></Warning>
</Target>

@ Edit1: utilisez CopyAllFilesToSingleFolderForPackage au lieu de PipelinePreDeployCopyAllFilesToOneFolder - les fichiers doivent être copiés après cette cible . Si vous devez activer votre cible uniquement lorsqu'elle est lancée dans le contexte VS - vérifiez le lien que j'ai posté et ajoutez quelques conditions supplémentaires - pour vérifier le lancement de Visual studio comme ceci: Condition="'$(BuildingInsideVisualStudio)'=='true' AND '$(VisualStudioVersion)'=='10.0'" Si vous ajoutez plus de contexte, comme quel type de cible voulez-vous lancer après la publication, etc. - cela pourrait ajouter plus de contexte et aider les autres à comprendre le problème

16
Alexey Shcherbak

Ajout de mes 2 centimes

MS a confirmé que lors de la publication sur le système de fichiers, ils n'ont aucune cible à lancer par la suite.

"Nous ne prenons actuellement pas en charge l’exécution de cibles personnalisées après la publication À partir de VS pour le protocole de système de fichiers."

Cité de cette SO question

Donc ce que nous avons fini par faire est:

  1. utilisez AfterTargets="CopyAllFilesToSingleFolderForPackage" (s'exécute juste avant que les fichiers ne soient copiés à l'emplacement de publication)
  2. qui exécute un bat-file
  3. le fichier de batte commence par une commande timeout 10 (attend 10 secondes), faute d'une meilleure solution.

IMPORTANT: Ce fichier bat doit être exécuté asynchrone pour que le processus de publication se poursuive après son lancement, veuillez vous reporter à this SO answer pour savoir comment procéder.

8
Alex

J'ai essayé toutes les autres réponses mais elles n'ont tout simplement pas fonctionné. Dans mon cas, je publie un complément VSTO avec VS2015, alors il se peut que quelque chose de différent se passe, mais voici deux options qui ont fonctionné:

<Target Name="AfterPublish">
  <Warning Text="publish warning 1" />
</Target>
<Target Name="CustomTarget" AfterTargets="AfterPublish">
  <Warning Text="publish warning 2" />
</Target>

Une des raisons pour lesquelles j’ai eu de la difficulté, avec d’autres, est que la tâche Message ne semble rien faire. Je m'attendais à un texte dans la vue Output, mais rien ne s'est affiché. Il n'y avait pas non plus d'éléments Message dans le Error List, mais en utilisant Warning à la place, ils apparaissaient dans le Error List. Malheureusement, je ne connais pas suffisamment MSBuild pour dire pourquoi Message ne se comporte pas comme prévu.

4
Chris

Je viens d'écrire un article sur la façon dont j'ai réalisé cela dans Visual Studio 2013 ici: http://www.alexdresko.com/2015/02/28/taking-visual-studio-build-and-publish-events-to- le niveau suivant/

C'est essentiellement la magie:

<Target Name="Mytarget" AfterTargets="MSDeployPublish" >
    <Message Text="The name of the publish profile is $(DestinationAppRoot)"/>   
    .... Here's where you do something awesome... 
</Target>

Je vous encourage à lire l'intégralité du post pour plus d'informations.

4
Alex Dresko

Ma réponse à une autre question pourrait être utile.

Le script AfterPublish ne s'exécute pas lorsque je publie une application Web

En particulier, en utilisant le chemin d'accès aux «fichiers publiés», vous pouvez transmettre un paramètre via $(WebProjectOutputDir)\$(WPPAllFilesInSingleFolder). Ce serait quelque chose comme c:\{path to *.csproj}\obj\{build configuration}\Package\PackageTmp.

0
Terry