2015-01-16 11 views
6

Ho un file .targets personalizzato che importare nel file di progetto dell'applicazione Web C# MVC. Ho aggiunto profilo personalizzato a questo modo:Destinazione non in esecuzione quando si utilizza BeforeTargets = "Build" su Build Server

<Target Name="CopyFiles" BeforeTargets="Build"></Target> 

Questo funziona bene quando si costruisce in Visual Studio, ma quando uso TeamCity per costruirlo, il bersaglio non viene mai eseguito, e non riesco a capire perché .

Se cambio il mio target per utilizzare BeforeTargets = "Compila", viene eseguito. In alternativa, se aggiungo un obiettivo supplementare con il nome di costruire per il file .targets

<Target Name="Build" /> 

allora verrà eseguito, ma in questo modo sostituisce l'esistente Costruire target e quindi la mia domanda non costruisce. Non riesco a capire la logica di questo, non ha senso. Sto usando l'obiettivo Compile per ora, ma se qualcuno potrebbe spiegare perché provare ad eseguirlo prima che l'attività di Build non funzioni, lo apprezzerei molto.

+0

Il file dei target personalizzati viene prelevato da TeamCity? È stato definitivamente aggiunto a VCS? – Castrohenge

+0

Sì, e sì. Come accennato, se lo cambio per utilizzare BeforeTargets = "Compila", viene eseguito. Solo non con l'attività di compilazione. –

risposta

8

'Build' è uno speciale target incorporato, quindi non funziona allo stesso modo della maggior parte degli altri target. Sicuramente non può essere ignorato in modo sicuro.

La documentazione più rilevante è qui: https://msdn.microsoft.com/en-us/library/ms366724.aspx

se volete qualcosa da eseguire prima costruzione, l'approccio standard (come consigliare dai commenti in una nuova creazione csproj file) è quello di ignorare il bersaglio BeforeBuild (come documentato sopra).

Tuttavia, questa non è la soluzione più affidabile. Come indicato nella documentazione di cui sopra:

obiettivi predefiniti di priorità assoluta è un modo semplice per estendere il processo di compilazione, ma, a causa MSBuild valuta la definizione degli obiettivi in ​​sequenza, non v'è alcun modo per impedire un altro progetto che importa il progetto da sovrascrivere gli obiettivi già sovrascritti.

E 'meglio (e solo leggermente più complesso), per ignorare la proprietà BuildDependsOn ed estendere il valore predefinito di questa proprietà per includere l'obiettivo che si desidera eseguire (anche questo è documentato nel link qui sotto).

Un altro approccio sarebbe quello di lasciare vuoto BeforeBuild e utilizzare BeforeTargets="BeforeBuild", che sembra un po 'strano, ma è abbastanza semplice e funzionerà anche se il target di BeforeBuild viene sostituito.

Per quanto riguarda il motivo per cui BeforeTargets="Build" non funziona, non riesco a trovare un riferimento per questo nella documentazione, ma penso che abbia a che fare con la sua natura speciale. Non funziona allo stesso modo degli obiettivi normali ed è probabilmente meglio non pensarlo affatto come obiettivo.

+5

Questo non è corretto, 'Build' è definito in' Microsoft.Common.CurrentVersion.targets' e si comporta come qualsiasi altro target. 'BeforeTargets =" Build "' è perfettamente valido. Il problema è che il target 'Build' è un bersaglio virtuale senza corpo reale e non viene sempre chiamato a seconda della situazione. Gli aspetti specifici variano a seconda della versione VS e del tipo di progetto, in particolare con i progetti web che sono disponibili in troppe varianti. Questo è il motivo per cui 'BeforeBuild' viene fornito come punto di estensione garantito per tutto basato su' Micrsoft.Common.targets'. –