2015-01-16 15 views
6

Mam niestandardowy plik .targets, który importuję do pliku projektu aplikacji WWW M # C# MVC. Dodałem własne cele, aby to tak:Cel nie działa podczas używania BeforeTargets = "Build" na serwerze Build

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

Działa to dobrze, gdy budowa pod Visual Studio, ale kiedy używam TeamCity ją zbudować, cel nigdy nie zostanie uruchomiona i nie mogę pracować, dlaczego .

Jeśli zmienię swój cel, aby użyć Przed Taryfami = "Kompilacja", to działa. Alternatywnie, jeśli dodać dodatkowy cel z nazwą Budowanie do pliku .targets

<Target Name="Build" /> 

wtedy to będzie działać, ale robi tak nadpisuje istniejący Budowanie cel, a więc moja aplikacja nie buduje. Nie mogę do końca zrozumieć logiki - to nie ma sensu. Używam teraz celu kompilacji, ale jeśli ktoś mógłby wyjaśnić, dlaczego próba wykonania go, zanim zadanie Build nie zadziała, byłbym bardzo wdzięczny.

+0

Czy Twoje docelowe pliki docelowe są zbierane przez TeamCity? Czy to na pewno dodano do ciebie VCS? – Castrohenge

+0

Tak, i tak. Jak wspomniano, jeśli zmienię go na BeforeTargets = "Compile", to działa. Po prostu nie z zadaniem Build. –

Odpowiedz

8

"Kompilacja" to specjalny wbudowany cel, więc nie działa tak samo jak większość innych celów. Z pewnością nie można go bezpiecznie przesłonić.

Najbardziej odpowiednia dokumentacja jest tutaj: https://msdn.microsoft.com/en-us/library/ms366724.aspx

Jeśli chcesz coś uruchomić przed kompilacji, metodę standardową (jak zalecane przez komentarze w nowo utworzone .csproj pliku) ma zastąpić cel BeforeBuild (jak udokumentowano powyżej).

Jednak nie jest to najbardziej niezawodne rozwiązanie. Jak zauważono w dokumentacji powyżej:

Nadrzędne zdefiniowanych celów jest łatwym sposobem na przedłużenie procesu kompilacji, ale ponieważ MSBuild ocenia definicję celów sekwencyjnie, nie ma sposobu, aby zapobiec inny projekt, który importuje projekt z przesłanianie celów, które już zostały zastąpione.

Lepiej (i tylko nieco bardziej skomplikowane), aby zastąpić własność BuildDependsOn i rozszerzyć domyślną wartość tej właściwości to cel, który chcesz uruchomić (jest to również udokumentowane w linku powyżej).

Innym podejściem byłoby pozostawienie BeforeBuild pustego i użycie BeforeTargets="BeforeBuild", co wydaje się nieco dziwne, ale jest dość proste i nadal będzie działać, nawet jeśli cel PrzedBuild zostanie nadpisany.

Jeśli chodzi o powód, dla którego BeforeTargets="Build" nie działa, nie mogę znaleźć odniesienia do tego w dokumentacji, ale myślę, że ma to związek z jego szczególnym charakterem. Nie działa tak samo jak zwykłe cele i prawdopodobnie lepiej nie myśleć o tym jako celu w ogóle.

+5

To jest niepoprawne, 'Build' jest zdefiniowany w' Microsoft.Common.CurrentVersion.targets' i zachowuje się jak każdy inny cel. 'BeforeTargets =" Build "' jest całkowicie poprawny. Problem polega na tym, że cel 'Build' jest wirtualnym celem bez rzeczywistego ciała i nie zawsze jest wywoływany w zależności od sytuacji. Szczegóły różnią się w zależności od wersji VS i typu projektu, szczególnie w przypadku projektów internetowych, które występują w zbyt wielu wariantach. Dlatego właśnie 'BeforeBuild' jest zapewniony jako gwarantowany punkt rozszerzenia dla wszystkiego na podstawie' Micrsoft.Common.targets'. –