Dlaczego powinienem używać MSBuild zamiast plików Visual Studio Solution?

21

Używamy TeamCity do ciągłej integracji, a my budujemy nasze wydania za pomocą pliku rozwiązania (.sln). W przeszłości korzystałem z Makefiles dla różnych systemów, ale nigdy nie budowałem msbuilda (co słyszałem, to trochę jak Makefiles + mashup XML). Widziałem wiele postów na temat używania msbuild bezpośrednio zamiast plików rozwiązania, ale nie widzę bardzo jasnej odpowiedzi na pytanie, dlaczego to zrobić.

Dlaczego więc mielibyśmy zawracać sobie głowę migracją z plików rozwiązania do „makefile” MSBuild? Mamy kilka wydań, które różnią się #define (featurized builds), ale w większości wszystko działa.

Bardziej niepokojące jest to, że teraz musielibyśmy utrzymywać dwa systemy podczas dodawania projektów / kodu źródłowego.

AKTUALIZACJA:

Czy ludzie mogą rzucić światło na cykl życia i wzajemne oddziaływanie trzech następujących elementów?

  1. Plik .sln programu Visual Studio
  2. Wiele plików .csproj na poziomie projektu (rozumiem skrypty msbuild „sub”)
  3. Niestandardowy skrypt msbuild

Czy można bezpiecznie powiedzieć, że .sln i .csproj są konsumowane / obsługiwane jak zwykle z poziomu graficznego interfejsu GUI programu Visual Studio IDE, podczas gdy niestandardowy skrypt msbuild jest pisany ręcznie i zwykle zużywa już istniejącą indywidualną wersję .csproj „w stanie, w jakim jest”? To jeden ze sposobów, w jaki widzę zmniejszenie nakładania się / duplikatów w konserwacji ...

Byłbym wdzięczny za trochę światła z doświadczeń operacyjnych innych ludzi

DeepSpace101
źródło
So, why should we bother migrating from solution files to an MSBuild 'makefile'?Najpierw musisz powiedzieć, dlaczego w ogóle to rozważasz? Czy plik rozwiązania nie jest wystarczający?
jgauffin
3
Ponieważ jest to uważane za lepszą praktykę. Na twoje ostatnie pytanie; może jest, może nie jest. Dlatego to pytanie ma na celu zbadanie go w celu uzyskania jaśniejszej odpowiedzi.
DeepSpace101
2
Because it's reputed to be better practicegdzie?
jgauffin
3
Segregacja IDE (pliku SLN) od kompilacji jest z pewnością dobrym projektem SE. Jeff napisał o tym na codinghorror.com/blog/2007/10/…, jeśli chcesz poznać szczegóły. Ponadto miło jest uruchomić testy, a nawet pakiet oprogramowania (setup.exe lub msi) jako część skryptu kompilacji wydania, a nie tylko kompilację kompilacji.
DeepSpace101
1
@jgauffin: sedodream.com/2010/03/19/…
Josh Noe

Odpowiedzi:

16

Po pierwsze, plik rozwiązania niemal w magiczny sposób staje się plikiem MSBuild, gdy MSBuild go wykonuje - co dzieje się, gdy budujesz rozwiązanie w Visual Studio. Ponadto wszystkie pliki projektu to tylko pliki msbuild zarządzane przez Visual Studio. W rzeczywistości pliki projektu obsługują większość naprawdę brudnej pracy tutaj, bez względu na to, czy budujesz z rozwiązań, czy z niestandardowego skryptu msbuild.

Korzystamy również z TeamCity do tworzenia i publikowania aplikacji i zwykle kończą się niestandardowymi skryptami msbuild dla większości projektów. Rola, jaką odgrywają te skrypty - co nie jest tak naprawdę łatwe w przypadku pliku rozwiązania - polega na pakowaniu projektu do wdrożenia lub dystrybucji. Zazwyczaj te skrypty obsługują niektóre bardziej operacyjne aspekty rzeczy - na przykład budowanie projektu internetowego do określonego folderu lub kopiowanie w uruchomionych konfiguracjach, w przeciwieństwie do konfiguracji programistycznych. Ciężkie podnoszenie zwykle wykonuje się w samych plikach projektu - skrypt kompilacji tylko je odwołuje, nie próbujemy odtworzyć tego koła. Ogólnie działa świetnie i nie jest tak naprawdę zduplikowanym kodem.

Wyatt Barnett
źródło
Więc używasz sln + csproj w Visual Studio, a następnie taki sam jak-jest niestandardowy skrypt msbuild csproj na serwerze kompilacji? Wyjaśniłem trochę pytanie. Dzięki!
DeepSpace101
Tak, są funkcjonalnie takie same.
Wyatt Barnett
15

Plik makefile dla msbuild to plik .sln (lub plik vcproj).

Typowy wiersz polecenia msbuild mógłby wyglądać następująco:

msbuild /p:Configuration=Release BigProject.sln

Celem użycia msbuild jest umożliwienie skryptowania i automatyzacji procesu kompilacji. Bez względu na to, czy zdawałeś sobie z tego sprawę, TeamCity od zawsze używa msbuild.

Charles E. Grant
źródło
Co sądzisz na temat drugiej części dotyczącej potencjalnego nakładania się różnych składników? (Mam nadzieję!) Wyjaśniłem pytanie nieco bardziej ... dzięki
DeepSpace101
3

Pozwól mi zaoferować swoje zdanie na temat tego pytania.

Chociaż z pewnością możesz po prostu użyć pliku .SLN jako „procesu kompilacji”, sam plik tak naprawdę nie stanowi procesu kompilacji. Plik Solution jest tak naprawdę tylko częścią Visual Studio i służy do programowania. Ale Visual Studio to tylko część procesu kompilacji i wydania. Nie możesz polegać na rozwiązaniach do zarządzania kompilacją, a rozwiązania z pewnością nie oferują skalowalnej sytuacji kompilacji.

Głównym celem ustanowienia procesu kompilacji jest tworzenie niezawodnych kompilacji. Innymi słowy, proces kompilacji jest tak niezawodny, że bez względu na konfigurację kompilacji otrzymasz przewidywalne wyniki kompilacji. Za każdym razem, każda maszyna. Wynikiem przewidywalnej i niezawodnej kompilacji jest to, że proces testowania, wdrażania i wydawania może być wysoce zautomatyzowany, co dodatkowo zmniejsza ryzyko błędu ludzkiego.

Ustanowienie procesu kompilacji wymaga inwestycji, ale w niektórych przypadkach inwestycja jest wymagana. Oto kilka czynników, które sprzyjają procesowi msbuild:

  • Twój produkt ma wiele zespołów (międzyfunkcyjnych lub innych), które pracują w tym samym projekcie zespołowym
  • Twoja organizacja ma tylko jeden projekt zespołowy (powinno tak być w przypadku 99% tradycyjnych sklepów, nawet tych z ponad 200 programistami)
  • Masz ponad 20 projektów, które należy zbudować, z których niektóre zależą od innych i są prowadzone przez różne zespoły
  • Twój produkt zawiera wiele technologii .NET (C #, C ++, VB, F #, ASP.NET itp.), A nawet technologie inne niż .NET (Grunt, węzeł, npm, Java itp.)
  • Twój produkt jest zależny od wagi ciężkiej lub jest zbudowany na platformie wagi ciężkiej. SharePoint, jako przykład

Pozwól, że podam przykład rozwinięcia mojej ostatniej kwestii. Moja obecna firma zajmuje się programowaniem SharePoint. Programowanie SharePoint co najmniej wymaga zainstalowania programu SharePoint Foundation, aby wykonywać kompilacje w projektach SharePoint. Mówiąc o lekkim serwerze kompilacji, całkowicie niepraktyczne jest wymaganie, aby serwer kompilacji miał zainstalowany program SharePoint. SharePoint jest nie tylko bestią o wysokich wymaganiach, ale miałby poważny wpływ na wydajność kompilacji - a kompilacje powinny być tak szybkie i uproszczone, jak to możliwe. Wykorzystanie MSBuild pozwala mi wyeliminować ten wymóg instalacji na serwerze kompilacji. W rzeczywistości nasz serwer kompilacji nie ma innych wymagań instalacyjnych niż platforma .NET (wymagana przez MSBuild) i Węzeł.

Jako odniesienie polecam sprawdzenie tej książki Sayeda Ibrahima Hashimi: http://www.amazon.com/Inside-Microsoft-Build-Engine-Foundation/dp/0735645248/ref=sr_1_fkmr0_1?ie=UTF8&qid=1412014650&sr= 8-1-fkmr0 i słowa kluczowe = msbuild + niezawodny + build

Mike Gilmore
źródło
1
Co wspólnego ma zastosowanie plików msbuild zamiast plików SLN z tym, że nie trzeba instalować SharePoint na serwerze kompilacji? Są to całkowicie niepowiązane pojęcia. Plik rozwiązania nie ma żadnej zależności od niczego. Ponadto możesz z pewnością polegać na plikach rozwiązań do zarządzania kompilacją, ponieważ nasza firma od lat robi to bez problemów. Myślę, że możesz mylić pliki rozwiązania i msbuild z samym narzędziem msbuild, które obsługuje także pliki rozwiązania. Nie używamy Visual Studio do kompilacji rozwiązania w maszynie do kompilacji.
julealgon
+1 za wyjaśnienie „Twoja organizacja ma tylko jeden projekt zespołowy”. Boli mnie, gdy widzę ludzi używających wielu Projektów Zespołowych jako granic dla takich rzeczy, jak „produkty” lub „projekty” w takich małych sklepach. Przyjąłem podejście do jednego zespołu i mam nadzieję, że nigdy nie będę musiał wracać.
JohnZaj,
2

To jest pytanie, które zadałem sobie kilka miesięcy temu! Wszystko ładnie skonfigurowaliśmy:

  • Plik rozwiązania ładnie w katalogu głównym repozytoriów
  • Twórz kroki skonfigurowane w Teamcity, np
    • Przywróć pakiety NuGet
    • Zbuduj rozwiązanie
    • Przeprowadź testy jednostkowe
    • Skonfiguruj środowisko testowe integracji
    • Przeprowadź testy integracyjne
    • Zniszcz środowisko testowe integracji
    • Utwórz pakiet wdrażania
    • Zbuduj skrypt migracji

A potem, jeśli chodzi o odtwarzalność, stało się jasne, że wynik ten był niski. Kiedy pozwalasz TeamCity na tworzenie skryptu kompilacji, trudno jest reprodukować podobne wyniki na swoim komputerze.

Gdy masz skrypt kompilacji, skrypt kompilacji wie wszystko, co należy zrobić, i ma wszystkie zmienne na swoim miejscu. Gdy używasz serwera CI jako skryptu kompilacji i zdarzają się pewne problemy, takie jak niepowodzenie złożonego testu lub konieczność ręcznego zbudowania pakietu wdrażania (jak w moim przykładzie), musisz złożyć wszystkie etapy kompilacji ręcznie.

Tak więc, w zwarcia , dlaczego (MS) skrypt budować? Ponieważ będziesz mieć więcej wymagań, jeśli chodzi o twoją kompilację. Prawdopodobnie chcesz przeprowadzić testy i wygenerować z nich artefakty. Prawdopodobnie chcesz wykonywać wdrożenia. A gdy wszystko, co chcesz, musi być uruchomione, bez względu na to, czy znajduje się na serwerze kompilacji, czy na komputerze, nie może skończyć się nigdzie indziej niż w skrypcie kompilacji.

Sebazzz
źródło
1
++ Właśnie dzisiaj pokłóciłem się z naszym tropem. Twoja kompilacja powinna być dostępna z dowolnego miejsca , a nie tylko z GUI w niektórych usługach w chmurze.
RubberDuck,