Cosa è successo a BeforeBuild e ad altri target in VS2012?

Sto cercando di ottenere alcuni passaggi pre-compilazione per lavorare in un progetto C ++ in Visual Studio 2012, ma non vengono richiamati (mentre sono abbastanza sicuro che le stesse tecniche erano OK in Visual Studio 2010). Le build da riga di comando si comportano esattamente allo stesso modo.

Questa è la fine del file di progetto; il file è stato generato utilizzando Visual Studio e quindi ho aggiunto l’ultimo paio di righe:

          

ed ecco l’output:

 Project "d:\temp\temp.vcxproj" on node 1 (default targets). InitializeBuildStatus: Creating "Debug\temp.unsuccessfulbuild" because "AlwaysCreate" was specified. AfterBuild: AfterBuild FinalizeBuildStatus: Deleting file "Debug\temp.unsuccessfulbuild". Touching "Debug\temp.lastbuildstate". 

Quindi viene considerato solo AfterBuild e gli altri vengono ignorati. Guardando in questo ho trovato questo PropertyGroup in Microsoft.BuildSteps.targets:

  _PrepareForBuild; $(BuildSteps); AfterBuild; FinalizeBuildStatus;  

Questo non dovrebbe avere anche obiettivi BeforeBuild e BuildEvent? O c’è qualcosa di sbagliato nella mia installazione di MSBuild che fa sì che usi questo file BuildSteps.targets invece di qualcos’altro?

Soluzione

Come sottolinea Alexey, l’uso di Before / AfterTarget offre una soluzione alternativa utilizzabile. Devi solo prenderti cura di quali obiettivi usare, ma questo è facile guardando il file BuildSteps. Questo sembra funzionare bene per ora:

          

Ho gli stessi obiettivi di msbuild che hai descritto, quindi penso che l’installazione di msbuild sia a posto. Sembra che decidano di fare un po ‘di pulizia degli obiettivi e delle dipendenze (non sono sicuro se questo problema riguardasse la versione VS, VS usasse gli stessi obiettivi, fornito da msbuild). BeforeBuild e altri target esistono ancora in Microsoft.common.targets. Suppongo che sia stato riservato solo per i progetti .NET (non ho mai giocato con quelli in C ++, quindi non so build la pipeline).

Ad ogni modo, indipendentemente dal fatto che funzioni o meno nelle versioni precedenti, il tuo problema può essere risolto molto più facilmente: basta usare i nuovi attributi BeforeTargets \ AfterTargets per MSBuild 4.0 e agganciare i tuoi obiettivi direttamente su quello che vuoi: