it-swarm.com.de

Nach dem Veröffentlichungsereignis in Visual Studio

Ich versuche, eine einfache Aufgabe nach dem Veröffentlichungsereignis aufzurufen. Wenn ich "Veröffentlichen" sage, bedeutet dies "Veröffentlichen" in Visual Studio. Klicken Sie mit der rechten Maustaste auf das Projekt und klicken Sie auf "Veröffentlichen ...". Ich habe eine (importierte) Zieldatei in die Projektdatei eingefügt, die gut funktioniert, da ich sie bereits beim Build-Ereignis getestet habe. Ich habe sie unter http://msdn.Microsoft.com/en-us/library gefunden /ms366724.aspx dass es ein AfterPublish-Ereignis gibt, das tun sollte, was ich brauche, aber nicht. Ich bin nicht sicher, ob es sich um dasselbe Ereignis handelt, das bei "In Visual Studio veröffentlichen" ausgelöst werden sollte. Jemand muss dies bitte klären. Meine Frage ist, wie eine Aufgabe aus einer Zieldatei bei "Publish in" ausgelöst wird Visual Studio?

Ich habe dies in der Zieldatei versucht:

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

Ich verwende Visual Studio 2010.

BEARBEITEN:

Ich suche tatsächlich nach einer Möglichkeit, bestimmte Aktionen für die Veröffentlichung in Visual Studio auszuführen. Ich habe auch darüber nachgedacht, Build-Events hinzuzufügen, aber ich habe keine Ahnung, wie ich feststellen kann, ob es sich um Publish in progress handelt oder nicht.

EDIT: @ Alexey Shcherbak Danke für Ihre schnelle Antwort. Ich bekomme dies in meiner MSBuild-Ausgabe:

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 ==========

Meine Aufgabe wird also direkt nach PipelinePreDeployCopyAllFilesToOneFolder ausgeführt, aber vor dem eigentlichen Kopieren der Dateien, und ich denke nicht, dass Publish zu diesem Zeitpunkt noch erledigt ist. Natürlich habe ich das tatsächlich getestet, also habe ich in MSBuild die Aufgabe ausgeführt Einfaches Lesen aus einer Textdatei, die in den Ordner "Veröffentlichen" kopiert werden soll, und es ist fehlgeschlagen.

22

Im Kontextmenü "Veröffentlichen" wird nicht das Ziel "Veröffentlichen" ausgeführt (wenn wir über die Veröffentlichungswebsite sprechen, nicht über das ClickOnce-Paket).

Wenn Sie das VS2010-Kontextmenü verwenden, wird das Ziel "PipelinePreDeployCopyAllFilesToOneFolder" ausgeführt. In VS2012 (beachten Sie dies, wenn Sie wechseln möchten) wird das Ziel "MSDeployPublish" ausgeführt.

Ich nehme an, Sie sollten diese Frage lesen und beantworten . Jez und ich haben ziemlich ausführlich darauf geantwortet, wie man sich mit dem Before\After-Publish-Ziel verbindet.

Kurz gesagt - für die MSBuild-Version> = 4.0 können Sie diesen Ansatz verwenden

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

@ Edit1: use CopyAllFilesToSingleFolderForPackage statt PipelinePreDeployCopyAllFilesToOneFolder - Die Dateien sollten nach diesem Ziel kopiert werden. Wenn Sie Ihr Ziel nur auslösen möchten, wenn es im VS-Kontext gestartet wird - Überprüfen Sie den von mir geposteten Link und fügen Sie weitere Bedingungen hinzu - um zu prüfen, ob Visual Studio so gestartet werden kann Condition="'$(BuildingInsideVisualStudio)'=='true' AND '$(VisualStudioVersion)'=='10.0'" Wenn Sie mehr Kontext hinzufügen, z. B. welches Ziel Sie nach dem Veröffentlichen starten möchten, usw., könnte dies weiteren Kontext hinzufügen und helfen Sie anderen, das Problem zu verstehen

16

Meine 2 Cent hinzufügen

MS hat bestätigt, dass beim Veröffentlichen im Dateisystem sie kein Ziel mehr zum Starten haben.

"Wir unterstützen derzeit nicht die Ausführung benutzerdefinierter Ziele nach der Veröffentlichung von Von VS für das Dateisystemprotokoll."

Zitiert aus dieser SO Frage

Also haben wir am Ende Folgendes getan:

  1. verwenden Sie AfterTargets="CopyAllFilesToSingleFolderForPackage" (wird ausgeführt, bevor die Dateien an den Veröffentlichungsort kopiert werden.)
  2. die führt eine bat-Datei aus
  3. die bat-Datei beginnt mit einem timeout 10-Befehl (wartet 10 Sekunden) - für den fehlenden besseren Weg.

WICHTIG: Diese bat-Datei muss asynchron ausgeführt werden, damit der Veröffentlichungsprozess nach dem Start fortgesetzt wird. Informationen dazu finden Sie in this SO answer .

8
Alex

Ich versuchte jede andere Antwort, aber sie funktionierte einfach nicht. In meinem Fall veröffentliche ich ein VSTO-Add-In mit VS2015. Vielleicht gibt es etwas anderes, aber hier sind zwei Optionen, die funktionieren:

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

Ein Teil des Grunds, warum ich (und vermutlich auch andere) eine schwierige Zeit damit gehabt haben, ist, dass die Message-Aufgabe nichts zu tun scheint. Ich habe Text in der Output-Ansicht erwartet, aber es wurde nichts angezeigt. Es gab auch keine Message-Elemente im Error List, aber indem Sie stattdessen Warning verwendeten, wurden sie im Error List angezeigt. Leider weiß ich nicht genug über MSBuild, um zu sagen, warum Message sich nicht wie erwartet verhält.

4
Chris

Ich habe gerade einen Beitrag darüber geschrieben, wie ich dies in Visual Studio 2013 erreicht habe: http://www.alexdresko.com/2015/02/28/taking-visual-studio-build-and-publish-events-to- das nächste Level/

Im Wesentlichen ist dies die Magie:

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

Ich ermutige Sie, den gesamten Beitrag zu lesen, um weitere Informationen zu erhalten.

4
Alex Dresko

Meine Antwort auf eine andere Frage könnte von Nutzen sein.

AfterPublish-Skript wird nicht ausgeführt, wenn ich eine Webanwendung veröffentliche

Über den Pfad zu den 'veröffentlichten Dateien' können Sie insbesondere einen Parameter über $(WebProjectOutputDir)\$(WPPAllFilesInSingleFolder) übergeben. Dies wäre so etwas wie c:\{path to *.csproj}\obj\{build configuration}\Package\PackageTmp.

0
Terry