2012-12-08 13 views
18

Sto tentando di richiamare un'attività semplice dopo l'evento di pubblicazione. Quando dico "pubblica", intendo pubblicare in Visual Studio, fare clic con il tasto destro del mouse sul progetto e premere "Pubblica ...". Ho incluso il file degli obiettivi (importati) nel file di progetto che funziona bene perché l'ho già testato sull'evento Build. Ho trovato a http://msdn.microsoft.com/en-us/library/ms366724.aspx che c'è un evento AfterPublish che dovrebbe fare ciò di cui ho bisogno, ma non è così. Non sono sicuro che si tratti di uno stesso evento che dovrebbe attivarsi su Pubblica in Visual Studio, per favore qualcuno lo chiarisca. La mia domanda è come attivare qualsiasi tipo di attività dal file di destinazione su Pubblica in Visual Studio?Dopo l'evento di pubblicazione in Visual Studio

Ho provato questo nel file di obiettivi:

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

Sto usando Visual Studio 2010.

EDIT:

realtà sto cercando un modo per eseguire determinate azioni su Pubblica in Visual Studio. Stavo anche pensando di aggiungere eventi di compilazione, ma non ho idea di come determinare se si tratta di pubblicazione in corso o meno.

MODIFICA: @Alexey Shcherbak grazie per la vostra risposta veloce. sto ottenendo questo nella mia uscita 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 ========== 

Quindi il mio compito sarà esegue subito dopo PipelinePreDeployCopyAllFilesToOneFolder ma prima effettiva coronamento dei file e non considero Publish essere ancora fatto in quel punto. Ovviamente, l'ho effettivamente testato, quindi nel compito di MSBuild stavo eseguendo una semplice lettura dal file di testo che si suppone debba essere copiato nella cartella Pubblica, e non è riuscita.

+0

aggiunto un'altra parte in risposta alla modifica –

risposta

14

Il menu di scelta rapida Pubblica non esegue il target "Pubblica" (se si tratta di pubblicare siti Web, non di pubblicare il pacchetto ClickOnce).

Se si utilizza VS2010, il menu di scelta rapida eseguirà la destinazione "PipelinePreDeployCopyAllFilesToOneFolder" e in VS2012 (tenere presente quando si intende passare) eseguirà la destinazione "MSDeployPublish".

Suppongo che dovresti leggere this question and answer. Jez e io abbiamo fornito una risposta piuttosto esauriente su come agganciare a Before \ After publish target.

In breve - per MSBuild versione> = 4.0 è possibile utilizzare questo approccio

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

@ Edit1: utilizzare CopyAllFilesToSingleFolderForPackage invece di PipelinePreDeployCopyAllFilesToOneFolder - i file devono essere copiati dopo questo obiettivo. Se hai bisogno di sparare al tuo obiettivo solo quando è lanciato nel contesto VS - controlla il link che ho postato e aggiungi altre condizioni - per verificare il lancio di Visual Studio come questo Condition="'$(BuildingInsideVisualStudio)'=='true' AND '$(VisualStudioVersion)'=='10.0'" Se aggiungi più contesto come che tipo di target vuoi lanciare dopo la pubblicazione ecc.- si potrebbe aggiungere più contesto e aiutare gli altri a capire il problema

+0

Si prega di consultare l'aggiornamento in questione, grazie. –

+0

Questo era il 'Target' che stavo cercando (se c'è un post sul blog che descrive TUTTI gli obiettivi di MSBuild mi farebbe piacere che qualcuno lo condividesse). Il mio problema era che volevo trasformare i file per passare solo alla pubblicazione, non alla costruzione. –

+0

@RobScott AFAIK non esiste una cosa del genere - il modo in cui MSBuild è progettato implica che il tuo set di target e le loro versioni (e sostituzioni) è piuttosto unico per la tua macchina e dipende da quali tipi di progetti \ SDKs di msbuild e VS hai installato. Compone dinamicamente uno script di compilazione basato sul proprio ambiente. Questo è molto potente ma allo stesso tempo molto fragile. Quindi non può avere una lista completa di obiettivi. Puoi imparare come leggere i log dettagliati e come leggere i file .target da soli, così sarai in grado di trovare quello che ti serve, ma non c'è alcun cheat = ( –

4

ho appena scritto un post su come ho raggiunto questo in Visual Studio 2013 qui: http://www.alexdresko.com/2015/02/28/taking-visual-studio-build-and-publish-events-to-the-next-level/

In sostanza, questa è la magia:

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

Vi incoraggio a leggere l'intero post per maggiori informazioni.

+1

Ci sono altre variabili come $ (DestinationAppRoot) per raggiungere l'URL di destinazione, ad esempio? –

+0

Non so, onestamente. Prova a cercare l'intero disco rigido per "DestinationAppRoot" e potresti inciampare in qualcosa di utile, non ricordo davvero come sia nata la soluzione pubblicata qui :) –

0

La mia risposta per un'altra domanda potrebbe essere di qualche utilità.

AfterPublish script doesn't run when I publish a web app

In particolare, utilizzando il percorso dei 'file pubblicati', è possibile passare in un parametro mediante $(WebProjectOutputDir)\$(WPPAllFilesInSingleFolder). Questo sarebbe qualcosa come c:\{path to *.csproj}\obj\{build configuration}\Package\PackageTmp.

+0

Quindi forse questo dovrebbe essere votato come duplicato invece di? –

+0

Non so se è "duplicato esatto" ... ho pensato che le mie informazioni sull'altra risposta potrebbero essere utili per fargli capire dove. Ti lascerò contrassegnare se lo ritieni necessario. Grazie. – Terry

+0

Non sono un esperto in materia qui. Se il post non è un duplicato, personalizza la tua risposta alla domanda, anche i link interni possono andare via e quindi i futuri visitatori sono bloccati con un link "vedi qui" che non punta da nessuna parte. –

1

Ho provato ogni altra risposta ma non hanno funzionato. Nel mio caso, sto pubblicando un VSTO Add-In con VS2015, quindi forse c'è qualcosa di diverso in corso, ma qui ci sono due opzioni che hanno fatto il lavoro:

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

Parte della ragione io (e assumedly altri) ha avuto un momento difficile con questo è che l'attività Message non sembra fare nulla. Mi aspettavo del testo nella vista Output, ma non si presentava nulla. Non ci sono stati articoli Message nello Error List, ma usando lo Warning invece, sono stati mostrati nello Error List. Purtroppo non so abbastanza su MSBuild per dire perché Message non si comporta come previsto.

+1

Ho provato questi in VS.NET 2017 RC4 e AfterTargets = "AfterPublish" uno ha funzionato. Grazie. – dstr

Problemi correlati