2010-08-24 4 views
25

Il compito più semplice del mondo (vedere sotto) non viene eseguito dopo aver pubblicato il mio progetto di applicazione web. Qualche idea del perché?AfterPublish target not working

<Target Name="AfterPublish"> 
    <Copy SourceFiles="C:\A.txt" DestinationFiles="C:\B.txt" /> 
</Target> 

risposta

2
  • È necessario definire ignorare l'obiettivo alla fine del file, dopo <Import ... />
  • lancio MSBuild con verbosità dettagliata per capire perché il vostro obiettivo è ignorato:

    msbuild project.csproj /t:Target_to_Launch /v:d 
    

AfterPublish viene chiamato dopo il target Publish, ma Publish non è la destinazione di destinazione d quando pubblichi un'applicazione web. Publish è l'obiettivo per la pubblicazione dell'applicazione ClickOnce.

Dovrete trovare il bersaglio usato quando si chiama Publish in Visual Studio, potrebbe essere Package, WebPublish ...

+0

E 'subito dopo il tag di importazione. – Mark

+0

Ecco alcuni punti salienti della uscita: destinazione prevalente "AfterPublish" nel progetto "c: \ ... \ Microsoft.Common.targets" con target "AfterPublish" di progetto "C: \ ... \ Ara.Web csproj". Destinazione "_DeploymentUnpublishable" nel file "c: \ ... \ Microsoft.Common.targets" dal progetto "C: \ ... \ Ara.Web.csproj": Attività "Messaggio" Saltare progetto non espulsa. Posso pubblicarlo da Visual Studio, ma l'attività AfterPublish non funziona. – Mark

29

Nota: Quanto segue si applica ai progetti di web-applicazioni VS2010 e la pubblicazione con il " Web Deploy "metodo di pubblicazione selezionato nella finestra di dialogo" Costruisci/Pubblica {nome progetto} ".

Julien Hoarau è corretto in quanto "Pubblica" NON è il nome del target msbuild richiamato nel caso precedente; il nome di destinazione effettivo è "MSDeployPublish".

Pertanto, è necessario definire un "Target" elemento cui valore "AfterTarget" di attributo è impostato su "MSDeployPublish" - il "Nome" il valore di attributo non non materia (a patto che sia unico tra i nomi degli obiettivi).

Ecco come si fa:

  • Aprire il file di progetto (ad esempio * csproj) in un testo/editor XML e, subito prima del tag di chiusura </Project>, aggiungere un elemento <Target Name="CustomPostPublishAction" AfterTargets="MSDeployPublish">; scegli un nome a tua scelta per "CustomPostPublishAction".
  • Aggiungere un cosiddetto elemento figlio Attività che esegue l'azione desiderata; per esempio, per aggiungere un comando da passare a cmd.exe, usa un elemento <Exec Command="..." />.

Esempio:

<Target Name="CustomPostPublishActions" AfterTargets="MSDeployPublish" > 
    <Exec Command="echo Post-PUBLISH event: Active configuration is: $(ConfigurationName)" /> 
</Target> 

Nota: (?)

  • In stringhe di comando, entità uso di XML riferimenti al posto di caratteri che si romperebbe parsing XML, ad esempio, "& gt" al posto di "<".
  • Per la documentazione dell'elemento <Target> in generale, vedere http://msdn.microsoft.com/en-us/library/t50z2hka.aspx
  • Task-elementi di riferimento qui: http://msdn.microsoft.com/en-us/library/7z253716.aspx
  • In generale, se è necessario determinare il nome del msbuild.exe target effettivamente invocato da Visual Studio 2010, effettuare le seguenti operazioni:
    • Vai su Strumenti/Opzioni ..., Progetto e soluzioni/Crea ed esegui, selezionare "Dettagliato" (o, per ulteriori informazioni, "Diagnostica ') dall'elenco a discesa etichettato' verbosità dell'output di generazione del progetto MSBuild.
    • Dopo aver eseguito il build/publish action, per esempio Costruire/Pubblica, esaminare la finestra di output per l'ultima occorrenza della stringa "Fatto Generazione target" per determinare il target di alto livello che è stato invocato.
+2

Ciao, Sai se c'è un modo per farlo funzionare con la pubblicazione FTP? –

+0

Mi piacerebbe fare questo lavoro per la pubblicazione File System ... qualsiasi ideia come? Grazie. –

+0

@MauricioRamalho: ti suggerisco di fare una nuova domanda_ (creare un nuovo post) con le specifiche. (Io personalmente non sarà di molto aiuto più, come non ho lavorato con queste cose da anni, ma sono sicuro che qualcuno sarà in grado di aiutarvi.) – mklement0

0

io sono un po 'pigro in questo momento di capire la confusione di obiettivi per trovare quello giusto per un file-based pubblicazione (che potrebbe essere interessato). Quello che puoi fare nel frattempo è definire una destinazione AfterBuild nel file * .pubxml.

<Target Name="AfterBuild"> 

...

Consiglio anche spegnendo le "DeleteExistingFiles" di proprietà, perché se si copiano i file nelle directory in corso di pubblicazione, fa un pulito da qualche parte durante il processo di pubblicazione.

<DeleteExistingFiles>False</DeleteExistingFiles> 
16

Visual Studio 2013. Pubblicare l'applicazione Web sul file system.

<Target Name="Moose" AfterTargets="GatherAllFilesToPublish" > 
    <Message Importance="high" Text="***Moooooooooooooooose***$(WPPAllFilesInSingleFolder)***$(TargetDir)" /> 
    </Target> 

Nota: assicurarsi che la registrazione della build sia impostata su almeno su Dettagliato. Cercalo in Strumenti -> Opzioni -> Progetti e Solutini -> Crea ed esegui -> verbosità di output di MSBuild. Anche la diagnostica va bene se si vuole indagare su quale build target è stata eseguita l'ultima volta prima della pubblicazione effettiva.

+4

Questo è l'unico obiettivo che spara per me in VS2015 quando si esegue una pubblicazione di un file system di un progetto di applicazione Web. Né MSDeployPublish né AfterPublish funzionano. – Rich

+0

Se si desidera ThePath pubblicato, l'uso $ (publishUrl) – mslot

+0

Sì! Questa è la risposta che stavo cercando, per così tanto tempo! – Daniel