Warum sollte ich MSBuild anstelle von Visual Studio Solution-Dateien verwenden?

21

Wir verwenden TeamCity für die kontinuierliche Integration und erstellen unsere Releases über die Lösungsdatei (.sln). Ich habe in der Vergangenheit Makefiles für verschiedene Systeme verwendet, aber nie msbuild (was ich gehört habe, ist ein bisschen wie Makefiles + XML-Mashup). Ich habe viele Posts darüber gesehen, wie man msbuild direkt anstelle der Lösungsdateien verwendet, aber ich sehe keine sehr klare Antwort, warum das so ist.

Warum sollten wir uns also die Mühe machen, von Lösungsdateien zu einem MSBuild-Makefile zu migrieren? Wir haben ein paar Releases, die sich durch #define (featurized builds) unterscheiden, aber größtenteils funktioniert alles.

Die größere Sorge ist, dass wir jetzt zwei Systeme warten müssen , wenn wir Projekte / Quellcode hinzufügen.

AKTUALISIEREN:

Können die Leute den Lebenszyklus und das Zusammenspiel der folgenden drei Komponenten beleuchten?

  1. Die .sln-Datei von Visual Studio
  2. Die vielen .csproj-Dateien auf Projektebene (von denen ich ein "untergeordnetes" msbuild-Skript verstehe)
  3. Das benutzerdefinierte msbuild-Skript

Ist es sicher zu sagen, dass .sln und .csproj wie gewohnt in der IDE-GUI von Visual Studio verwendet / verwaltet werden, während das benutzerdefinierte msbuild-Skript handgeschrieben ist und normalerweise das bereits vorhandene individuelle .csproj "wie es ist" verwendet? So kann ich sehen, dass Überlappungen / Duplikate bei der Wartung reduziert werden ...

Ich würde es begrüßen, wenn ich etwas Licht auf die Betriebserfahrung anderer Leute werfen könnte

DeepSpace101
quelle
So, why should we bother migrating from solution files to an MSBuild 'makefile'?Zuerst musst du dir sagen, warum du überhaupt darüber nachdenkst? Reicht die Lösungsdatei nicht aus?
jgauffin
3
Weil es angeblich besser ist. Für Ihre letzte Frage; Vielleicht ist es das, vielleicht ist es das nicht. Das ist der Grund, warum diese Frage untersucht wird, um eine klarere Antwort zu erhalten.
DeepSpace101
2
Because it's reputed to be better practicewoher?
jgauffin
3
Die Trennung der IDE (sln-Datei) vom Build ist sicherlich ein gutes SE-Design. Jeff hat unter codinghorror.com/blog/2007/10/… darüber geschrieben, wenn Sie Details wünschen. Außerdem ist es schön, Tests und sogar Softwarepakete (setup.exe oder msi) als Teil des Release-Build-Skripts zu starten, anstatt nur den Build zu kompilieren.
DeepSpace101
1
@jgauffin: sedodream.com/2010/03/19/…
Josh Noe

Antworten:

16

Der erste Fakt ist, dass die Lösungsdatei beim Ausführen von MSBuild auf magische Weise zu einer MSBuild-Datei wird - was passiert, wenn Sie die Lösung in Visual Studio erstellen. Außerdem handelt es sich bei all diesen Projektdateien nur um MSBuild-Dateien, die von Visual Studio verwaltet werden. Tatsächlich erledigen die Projektdateien die meiste echte Dirty-Arbeit, egal ob Sie aus Lösungen oder einem benutzerdefinierten msbuild-Skript erstellen.

Wir verwenden TeamCity auch zum Erstellen und Veröffentlichen von Anwendungen. In der Regel erhalten wir für die meisten Projekte benutzerdefinierte msbuild-Skripte. Die Rolle dieser Skripte - was mit einer Lösungsdatei nicht ganz einfach ist - besteht darin, das Projekt für die Bereitstellung oder Verteilung zu packen. In der Regel behandeln diese Skripte einige betriebliche Aspekte von Dingen - wie das Erstellen des Webprojekts in einem bestimmten Ordner oder das Kopieren in den laufenden Konfigurationen im Gegensatz zu den Entwicklungskonfigurationen. Das schwere Heben wird in der Regel in den Projektdateien selbst behandelt - das Build-Skript verweist nur auf diese, wir versuchen nicht, dieses Rad neu zu erstellen. Insgesamt funktioniert es großartig und es ist nicht wirklich viel duplizierter Code.

Wyatt Barnett
quelle
Sie verwenden also sln + csproj in Visual Studio und dann das gleiche Skript wie csproj + custom msbuild auf dem Buildserver? Ich habe die Frage ein bisschen geklärt. Vielen Dank!
DeepSpace101
Ja, sie sind funktional gleich.
Wyatt Barnett
15

Das Makefile für msbuild ist die .sln-Datei (oder die vcproj-Datei).

Eine typische msbuild-Befehlszeile würde ungefähr so ​​aussehen:

msbuild /p:Configuration=Release BigProject.sln

Mit msbuild können Sie den Erstellungsprozess skripten und automatisieren. Unabhängig davon, ob Sie es bemerkt haben oder nicht, TeamCity hat msbuild die ganze Zeit verwendet.

Charles E. Grant
quelle
Was halten Sie vom letzten Teil, von der möglichen Überschneidung der verschiedenen Komponenten? Ich habe (hoffentlich!) Die Frage ein bisschen genauer geklärt ... thx
DeepSpace101
3

Lassen Sie mich diese Frage beantworten.

Obwohl Sie Ihre .SLN-Datei mit Sicherheit einfach als "Build-Prozess" verwenden können, handelt es sich bei der Datei selbst nicht um einen Build-Prozess. Die Lösungsdatei ist eigentlich nur ein Teil von Visual Studio und wird für die Entwicklung verwendet. Visual Studio ist jedoch nur ein Teil des Build- und Release-Prozesses. Sie können sich bei der Verwaltung Ihres Builds nicht auf Solutions verlassen, und Solutions bieten mit Sicherheit keine skalierbare Build-Situation.

Der gesamte Zweck des Einrichtens eines Erstellungsprozesses besteht darin, zuverlässige Erstellungen zu erstellen. Das heißt, der Build-Prozess ist so zuverlässig, dass Sie unabhängig von der Build-Konfiguration eine vorhersehbare Build-Ausgabe erhalten. Jedes Mal, jede Maschine. Das Ergebnis einer vorhersehbaren und zuverlässigen Erstellung ist, dass der Test-, Bereitstellungs- und Veröffentlichungsprozess in hohem Maße automatisiert werden kann, wodurch das Risiko menschlicher Fehler weiter verringert wird.

Das Einrichten eines Erstellungsprozesses erfordert eine Investition, aber in bestimmten Fällen ist die Investition erforderlich. Hier sind einige Faktoren, die einen msbuild-Prozess begünstigen:

  • Ihr Produkt verfügt über mehrere Teams (funktionsübergreifend oder anderweitig), die in demselben Teamprojekt arbeiten
  • Ihre Organisation hat nur ein Teamprojekt (dies sollte bei 99% der traditionellen Geschäfte der Fall sein, auch bei Geschäften mit mehr als 200 Entwicklern).
  • Sie müssen mehr als 20 Projekte erstellen, von denen einige von anderen abhängig sind und von verschiedenen Teams verwaltet werden
  • Ihr Produkt enthält mehrere .NET-Technologien (C #, C ++, VB, F #, ASP.NET usw.) oder sogar Nicht-.NET-Technologien (Grunt, Node, Npm, Java usw.).
  • Ihr Produkt weist Schwergewichtsabhängigkeiten auf oder basiert auf einer Schwergewichtsplattform. SharePoint als Beispiel

Lassen Sie mich ein Beispiel geben, um meinen letzten Punkt zu erläutern. Mein aktuelles Unternehmen entwickelt SharePoint. Für die SharePoint-Entwicklung muss mindestens SharePoint Foundation installiert sein, um Builds für SharePoint-Projekte ausführen zu können. Da es sich um einen kompakten Build-Server handelt, ist es völlig unpraktisch, auf dem Build-Server SharePoint zu installieren. SharePoint ist nicht nur eine Bestie mit hohen Anforderungen, sondern es würde auch schwerwiegende Auswirkungen auf die Leistung eines Builds haben - und Builds sollten so schnell und schlank wie möglich sein. Durch die Nutzung von MSBuild kann ich diese Installationsanforderung auf dem Buildserver beseitigen. Für unseren Build-Server gelten keine anderen Installationsanforderungen als .NET Framework (von MSBuild benötigt) und Node.

Als Referenz würde ich empfehlen, dieses Buch von Sayed Ibrahim Hashimi zu lesen: http://www.amazon.com/Inside-Microsoft-Build-Engine-Foundation/dp/0735645248/ref=sr_1_fkmr0_1?ie=UTF8&qid=1412014650&sr= 8-1-fkmr0 & keywords = msbuild + zuverlässig + build

Mike Gilmore
quelle
1
Was hat die Verwendung von msbuild-Dateien anstelle von sln-Dateien damit zu tun, dass SharePoint nicht auf dem Buildserver installiert werden muss? Dies sind völlig unabhängige Konzepte. Die Lösungsdatei ist von nichts abhängig. Außerdem können Sie sicher auf Lösungsdateien verlassen Ihren Build zu verwalten, da dies ist es, was unser Unternehmen seit Jahren ohne Probleme tun. Ich denke, Sie können Lösung und Msbuild-Dateien mit dem Msbuild-Tool selbst verwechseln, das auch Lösungsdateien unterstützt. Wir verwenden kein Visual Studio, um die Lösung in der Build-Maschine zu kompilieren.
Julealgon
+1 für Ihre Erklärung zu "Ihre Organisation hat nur ein Teamprojekt". Es schmerzt mich, wenn Leute mehrere Teamprojekte als Grenzen für Dinge wie "Produkte" oder "Projekte" in solchen kleinen Läden verwenden. Ich habe den Single-Team-Projektansatz gewählt und muss hoffentlich nie mehr zurück.
JohnZaj
2

Das ist genau die Frage, die ich mir vor ein paar Monaten gestellt habe! Wir hatten alles gut vorbereitet:

  • Lösungsdatei im Stammverzeichnis der Repositorys
  • Erstellen Sie Schritte, die in Teamcity konfiguriert wurden, z
    • Stellen Sie NuGet-Pakete wieder her
    • Lösung erstellen
    • Führen Sie Komponententests durch
    • Richten Sie die Testumgebung für die Integration ein
    • Führen Sie Integrationstests durch
    • Integrations-Testumgebung herunterfahren
    • Erstellen Sie ein Bereitstellungspaket
    • Erstellen Sie ein Migrationsskript

Und wenn es um die Reproduzierbarkeit ging, stellte sich heraus, dass diese schlecht abschnitt. Wenn Sie TeamCity als Build-Skript verwenden, ist es schwierig, ähnliche Ergebnisse zuverlässig auf Ihrem eigenen Entwicklungscomputer zu reproduzieren.

Wenn Sie ein Erstellungsskript haben, kennt das Erstellungsskript alles, was getan werden muss, und verfügt über alle Variablen. Wenn Sie einen CI-Server als Erstellungsskript verwenden und ein Problem auftritt, z. B. ein komplexer Test, der fehlschlägt oder ein Bereitstellungspaket manuell erstellt werden muss (gemäß meinem Beispiel), müssen Sie alle Schritte der Erstellung manuell zusammenfassen.

Also, kurz gesagt , warum ein (MS) Build-Skript? Weil Sie am Ende mehr Anforderungen haben, wenn es um Ihren Build geht. Sie möchten wahrscheinlich einige Tests durchführen und daraus einige Artefakte generieren. Sie möchten wahrscheinlich Bereitstellungen durchführen. Und wenn alles, was Sie wollen, ausführbar sein muss, sei es auf einem Build-Server oder Ihrem Computer, kann es nur in einem Build-Skript enden.

Sebazzz
quelle
1
++ Ich hatte gerade dieses Argument mit unserem Vorsprung heute. Ihr Build sollte von überall ausgeführt werden können , nicht nur von einer GUI auf einem Cloud-Dienst.
RubberDuck