NAnt oder MSBuild, welches soll man wann wählen?

160

Mir ist bekannt, dass es andere NAnt und MSBuild gibt Fragen zu zu Stack Overflow gibt, aber ich konnte keinen direkten Vergleich zwischen den beiden hier die Frage.

Wann sollte man NAnt gegenüber MSBuild wählen? Welches ist besser für was? Ist NAnt besser für Home / Open Source-Projekte und MSBuild für Arbeitsprojekte geeignet? Wie ist die Erfahrung mit einem der beiden?

Yordan Pavlov
quelle

Antworten:

97

Ich habe diese Woche eine ähnliche Untersuchung durchgeführt. Folgendes konnte ich feststellen:

NAnt:

  • Plattformübergreifend (unterstützt Linux / Mono). Dies kann beispielsweise nützlich sein, um eine Website auf mehreren Zielen (z. B. Linux Apache und Windows IIS) zu installieren.
  • 95% ähnliche Syntax wie Ant (für aktuelle Ant-Benutzer oder Java-Builder leicht zu erlernen)
  • Integration mit NUnit zum Ausführen von Komponententests als Teil des Builds und mit NDoc zur Produktdokumentation.

MSBuild:

  • In .NET integriert.
  • Integriert in Visual Studio
  • Einfacher Einstieg in MSBuild in Visual Studio - alles hinter den Kulissen. Wenn Sie tiefer gehen möchten, können Sie die Dateien von Hand bearbeiten.

Subjektive Unterschiede: (YMMV)

  • Die NAnt-Dokumentation ist etwas unkomplizierter. In der MSBuild-Aufgabenreferenz wird beispielsweise "Csc-Aufgabe - Beschreibt die Csc-Aufgabe und ihre Parameter" (danke für die "Hilfe"?) Im Vergleich zur NAnt-Aufgabenreferenz "csc - Kompiliert C # -Programme" aufgeführt. UPDATE: Ich habe die MSBuild-Dokumentation bemerkt verbessert wurde und jetzt viel besser ist (wahrscheinlich auf dem Niveau von NAnt).
  • Es ist nicht einfach herauszufinden, wie die Build-Skriptquelle (*. * Proj-Datei) direkt in Visual Studio bearbeitet werden kann. Mit NAnt muss Visual Studio das .build-Skript nur als XML-Datei behandeln.
  • Anscheinend erhalten Webanwendungsprojekte in Visual Studio standardmäßig keine *. * Proj-Datei, sodass ich große Schwierigkeiten hatte, herauszufinden, wie MSBuild überhaupt auf meinem ausgeführt werden kann, um ein Bereitstellungsskript zu erstellen.
  • NAnt ist nicht in Visual Studio integriert und muss entweder mit einem Add-In oder als "externes Tool" hinzugefügt werden. Dies ist ein bisschen mühsam einzurichten.
  • (Bearbeiten :) Einer meiner Mitarbeiter hat dies angesprochen. Wenn Sie eine Build-Maschine mit CruiseControl für die kontinuierliche Integration einrichten möchten , lässt sich CruiseControl sofort in NAnt integrieren. UPDATE: CruiseControl hat auch eine MSBuild-Aufgabe .
  • In den Kommentaren unten finden Sie eine vollständige und aktuelle Diskussion der subjektiven Unterschiede.
Oger Psalm33
quelle
Sie können eine .proj-Datei bearbeiten, aber nachdem Sie das Projekt entladen haben (es sollte eine Option "Entladen" im Kontextmenü des Projekts geben)
Yordan Pavlov
18
@Yordan: oder fügen Sie Ihre Anpassungen einfach in eine separate .build-Datei (oder was auch immer) ein und importieren + führen Sie diese aus Ihrer .csproj-Datei aus. Dann müssen Sie die .csproj nur einmal bearbeiten und können die .build-Datei zu Ihrer Lösung hinzufügen. Doppelklicken Sie und Sie bearbeiten wie jede andere Datei. Kann .build-Dateien in Ihren Optionen dem XML-Editor zuordnen.
Kent Boogaart
9
Es existiert eine MSBuild CCNet Aufgabe - Die Details finden Sie unter: confluence.public.thoughtworks.org/display/CCNET/MsBuild+Task
Gavin Miller
2
Beachten Sie, dass Sie die .csproj-Dateien nicht selbst ändern müssen. Sie können eine MyProject.csproj.user-Datei verwenden, um diese Änderungen vorzunehmen, sodass Ihre .csproj-Datei sauber und makellos bleibt. MSBuild sucht nach diesen .user-Dateien und importiert sie automatisch in den Erstellungsprozess. Siehe: ahmed0192.blogspot.com/2006/11/…
CleverPatrick
3
@CleverHuman, enthält diese .user-Datei normalerweise keine benutzerspezifischen Mods für das Projekt, die Sie normalerweise nicht zusammen mit dem Rest des Projekts einchecken würden? Ich habe Kents Vorschlag jahrelang verwendet und er funktioniert sehr gut. Sie ändern die PROJ-Datei einmal, um eine zweite PROJ-Datei aufzunehmen, und fügen dann die zweite PROJ-Datei zu Ihrem Projekt hinzu. Von da an können Sie diese zweite PROJ-Datei problemlos anpassen, ohne diesen Entlade- / Neuladevorgang durchlaufen zu müssen. Ich neige dazu, mich aus genau diesem Grund zu MSBuild zu neigen.
DarinH
77

Eine der Hauptattraktionen von MSBuild für mich (auf Windows-Plattformen) ist, dass es Teil von .NET selbst ist. Das bedeutet, dass auf jedem Windows-Computer, der mit Windows Update auf dem neuesten Stand ist, MSBuild verfügbar ist. Hinzu kommt, dass der C # -Compiler auch Teil von .NET selbst ist und Sie über eine Plattform verfügen, die Projekte auf sauberen Computern erstellen kann. Visual Studio Behemoth muss nicht installiert werden. NAnt muss dagegen explizit installiert werden, bevor ein Build ausgelöst werden kann.

Nur zur Veranschaulichung: Ich habe in der Vergangenheit NMake, Make, Ant, Rake, NAnt und MSBuild für nicht triviale Builds verwendet (in dieser Reihenfolge). Mein Favorit ist zweifellos MSBuild (und ich bevorzuge es nicht, weil "das ist, was Visual Studio verwendet"). IMHO ist es ein sehr unterschätztes Build-Tool.

Ich würde NAnt vs. MSBuild mit dem Unterschied zwischen prozeduraler und funktionaler Programmierung vergleichen. NAnt ist ganz einfach und Sie bekommen, was Sie sehen. MSBuild hingegen erfordert etwas mehr Nachdenken. Die Lernkurve ist steiler. Aber sobald Sie es "verstanden" haben, können Sie einige erstaunliche Dinge damit machen.

Daher würde ich empfehlen, sich MSBuild anzuschauen, wenn Sie sich auch für funktionale oder logische Programmierung interessieren - wenn Sie bereit sind, ein wenig Zeit und Mühe zu investieren, bevor Sie greifbare Ergebnisse sehen (natürlich glaube ich auch fest daran, dass sich die Investition letztendlich auszahlt und Sie kann mächtigere Dinge effizienter machen).

Milan Gardian
quelle
11
Beeindruckend! Wusste nicht, dass MSBuild mit der Laufzeit ausgeliefert wurde. Das ist ziemlich cool und ich kann definitiv Vorteile dort sehen. Ich verstehe jedoch den Vergleich zwischen funktional / prozedural nicht. Es wäre interessant zu hören, was MSBuild so viel leistungsfähiger macht, wenn man es "bekommt".
Scott Saad
2
Msbuild hat tatsächlich eine Reihe von Abhängigkeiten von Dateien von verschiedenen SDKS, die erst beim Aufrufen bestimmter Ziele sichtbar werden. Obwohl msbuild sofort verfügbar ist, wird es möglicherweise nicht ausgeführt.
Sam Shiles
6
Eines sollte hinzugefügt werden: Es ist nicht nur möglich, aus msbuild heraus .NET-Assemblys aufzurufen, wodurch man auf eine Reihe sehr nützlicher Funktionen zugreifen kann (z. B. kann alles in Systme.IO.Path in Build-Skripten nützlich sein). Es ist auch möglich, einfachen C # -Code in msbuild-Dateien zu schreiben und ausführen zu lassen. Welches ist einfach genial. msdn.microsoft.com/en-us/library/dd722601.aspx Und wenn die Dinge zu kompliziert werden, ist das Schreiben von benutzerdefinierten Aufgaben ebenfalls ein Kinderspiel.
Stijn
1
Aus Wikipedia: " MSBuild wurde zuvor mit .NET Framework gebündelt. Ab Visual Studio 2013 wird es jedoch stattdessen mit Visual Studio gebündelt."
DavidRR
MSBuild (Microsoft Build Tools 2013) kann hier auch unabhängig von Visual Studio 2013 heruntergeladen werden .
DavidRR
45

Persönlich benutze ich beide - für das gleiche Projekt.

MSBuild eignet sich hervorragend zum Erstellen von Visual Studio-Lösungen und -Projekten - dafür ist es gemacht.

NAnt ist meiner Meinung nach leichter von Hand zu bearbeiten - besonders wenn Sie Ant bereits kennen. NAnt kann MSBuild sehr einfach mit NAntContrib aufrufen. Also erstelle ich ein NAnt-Skript von Hand, um beispielsweise erstellte Dateien zu kopieren, zu bereinigen usw. - und rufe MSBuild auf, um den eigentlichen Teil "Verwandle meinen C # -Quellcode in Assemblys" auszuführen.

Wenn Sie ein Beispiel dafür möchten, schauen Sie sich meine Protokollpuffer-Build-Datei an . (Ich würde nicht behaupten, dass es ein fabelhaftes NAnt-Skript ist, aber es macht den Job.)

Jon Skeet
quelle
1
Und es unterstützt Mono. Monos MSBuild-Unterstützung ist beschissen.
Mehrdad Afshari
@Mehrdad: Ja, irgendwann muss ich wirklich versuchen, Protokollpuffer zum Kompilieren auf Mono zu bringen ... derzeit gibt es einen gmcs-Fehler, der das Funktionieren verhindert :( Die Idee war immer, dass es irgendwann auf Mono funktionieren würde.
Jon Skeet
1
Leute, Mono verwendet XBuild und es ist einfach, MSBuild auf XBuild zu portieren. Überprüfen Sie dies: mono-project.com/Porting_MSBuild_Projects_To_XBuild .
Fyasar
20

NAnt hat sofort mehr Funktionen, aber MSBuild verfügt über eine viel bessere Grundstruktur ( ), die das Erstellen wiederverwendbarer MSBuild-Skripte erheblich vereinfacht.

Es dauert eine Weile, bis MSBuild verstanden ist, aber wenn Sie es einmal getan haben, ist es sehr schön.

Lernmaterialien:

Konstantin Tarkus
quelle
38
Hey, ich habe von diesen Büchern gehört :)
sagte Ibrahim Hashimi
19

KISS = MSBuild verwenden.

Warum etwas anderes in die Mischung aufnehmen, wenn Sie etwas haben, das sofort einen vernünftigen Job macht? Als MSBuild ankam, starb NAnt. Und Mono wird eine MSBuild-Implementierung haben ( xbuild ).

DRY = MSBuild verwenden.

Fragen Sie sich, was Sie von einem Build-System erwarten? Ich möchte ein Build-System, das auch von meiner IDE verwendet wird, anstatt zwei verschiedene Konfigurationen beizubehalten.

Persönlich würde ich gerne einige echte Argumente für NAnt hören, weil ich mir einfach keine vorstellen kann, die wirklich Wasser halten.

Eichhörnchen
quelle
2
"Als msbuild ankam, starb nant" - ich denke, dies ist der Drahtreifen, auch ohne VS (das ich nicht benutze).
Harpo
Genau. DotNet 1.1 hatte keine msbuild.exe. Also wurden wir damals geschraubt. Seit 2.0 tun msbuild.exe und die zusätzlichen Bibliotheken viel. Und das Schreiben einer benutzerdefinierten MsBuild-Aufgabe hat eine Lernkurve, aber ich habe im Laufe der Jahre ungefähr 10 davon geschrieben.
GranadaCoder
1
Ich muss zustimmen, dass Sie als Entwickler dasselbe Tool zum Erstellen verwenden sollten, das der Build-Server verwendet, damit Sie schneller ausfallen können.
Krystan Ehre
14

Eine Sache, die mir auf mehreren Postern aufgefallen ist, war die manuelle Bearbeitung der .csproj- (oder .vbproj- usw.) Dateien.

MSBuild ermöglicht die Anpassung dieser. * Proj-Dateien mithilfe von .user-Dateien. Wenn ich ein Projekt mit dem Namen habe MyCreativelyNamedProject.csproj und will in der es die MSBuild Aufgaben anpassen, kann ich eine Datei mit dem Namen erstellen MyCreativelyNamedProject.csproj.user und die Verwendung CustomBeforeMicrosoftCommonTargets und CustomAfterMicrosoftCommonTargets , um diese Dateien anpassen.

Außerdem können sowohl NAnt als auch MSBuild durch benutzerdefinierte MSBuild-Aufgaben und durch NantContrib-Erweiterungen an den Inhalt des Herzens angepasst werden.

Die Verwendung von NAnt oder MSBuild hängt also wirklich von der Vertrautheit ab:

  • Wenn Sie bereits mit Ant vertraut sind, verwenden Sie NAnt. Die Lernkurve wird sehr einfach sein.
  • Wenn Sie mit keinem der beiden Tools vertraut sind, ist MSBuild bereits in Visual Studio integriert und erfordert keine zusätzlichen Tools.

Es ist auch erwähnenswert, dass MSBuild so gut wie garantiert mit allen neuen Versionen von .NET und Visual Studio funktioniert, sobald sie veröffentlicht werden, während NAnt möglicherweise eine gewisse Verzögerung aufweist.

CleverPatrick
quelle
1
+1 für den Hinweis auf eine Verzögerung zwischen .net-Releases und Nant-Releases. Ich erinnere mich, als .net 3.5 herauskam und eine gehackte nant.exe.config von out on 'nets verwenden musste, um die Dinge zum Laufen zu bringen. Kein Spaß.
mmacaulay
9
Laut vielen Beiträgen hier enthalten diese .USER-Dateien + benutzerspezifische Informationen +, die nicht eingecheckt werden sollten. Dies wäre also der letzte Ort, an dem ich Build-Anpassungen vornehmen möchte ... Alle Build-Anpassungen per Definition sollten nicht Es ist nicht benutzerspezifisch und sollte daher nicht in diese .user-Dateien aufgenommen werden ...
DarinH
1
Stimmen Sie mit Drventure überein; .user-Dateien sind, wie der Name schon sagt, ein Benutzer und sollten nicht einmal in Ihr Quellcodeverwaltungs-Repository eingecheckt werden. Dies ist NICHT der Ort, um den Build zu automatisieren.
Kjetil Klaussen
10

Ich verwende beides, indem meine NAnt- Skripte MSBuild aufrufen. Mein Hauptgrund für den Aufenthalt bei NAnt ist die Isolation . Lassen Sie mich erklären, warum ich das für wichtig halte:

  1. Hinzufügen von Abhängigkeiten zu Ihrem Projekt. Die NAnt-Build-Datei ist Visual Studio fremd (in meinem Fall halte ich dies für einen Profi), sodass Visual Studio nicht versucht, etwas damit zu tun. MSBuild-Aufgaben sind eingebettet in die Lösung und können auf andere MSBuild-Aufgaben verweisen. Ich habe den Quellcode von jemand anderem erhalten, nur um herauszufinden, dass ich ihn nicht erstellen konnte, da die MSBuild-Community-Aufgaben nicht installiert wurden. Was ich besonders frustrierend finde, ist, dass Visual Studio einfach nicht erstellt und eine Reihe von Fehlern verursacht hat, die mir das Debuggen von Zeit verloren haben. Dies trotz der Tatsache, dass der angeforderte Build (beispielsweise als Debug-Build) ohne einige der Extras der MSBuild-Task hätte ausgeführt werden können. Kurz gesagt: Ich mag es nicht, meinem Projekt Abhängigkeiten hinzuzufügen, wenn ich es vermeiden kann .

  2. Ich vertraue Visual Studio nicht so weit ich sein Entwicklungsteam werfen kann. Dies geht auf die frühen Tage von Visual Studio zurück, als es mein HTML massakrierte. Ich benutze den Designer zum Beispiel immer noch nicht (auf einer Konferenz habe ich kürzlich festgestellt, dass Kollegen dasselbe getan haben). Ich habe festgestellt, dass Visual Studio Abhängigkeiten und Versionsnummern in der DLL-Datei vermasseln kann (ich kann dies nicht replizieren, aber es ist in einem Projekt konsistent passiert und hat viel Kummer und Zeitverlust verursacht). Ich habe auf eine Erstellungsprozedur zurückgegriffen, die Visual Studio verwendet, um nur im Debug-Modus zu erstellen. Für die Produktion verwende ich NAnt, um alles extern zu steuern . Visual Studio kann einfach nicht mehr stören, wenn ich mit NAnt baue.

PS: Ich bin ein Webentwickler und mache keine Windows Forms-Entwicklung.

Peter Mortensen
quelle
6

Obwohl ich mit MsBuild nicht sehr vertraut bin, habe ich den Eindruck, dass einige der wichtigsten Unterschiede auf beiden Seiten durch Ergänzungen ergänzt werden können:

Ich musste kürzlich ein Silverlight-Projekt in Nant bauen. Ich entdeckte, dass das Leben einfacher wäre, wenn ich dies nur mit MsBuild tun würde. Am Ende rief ich eine MsBuild-Aufgabe aus einem Nant-Skript heraus auf, daher ist es wohl nicht ungewöhnlich, die beiden zu mischen und zu kombinieren.

Darüber hinaus wird es wohl eine Frage der persönlichen Präferenz sein - natürlich können Sie einige / die meisten Funktionen von MsBuild in Visual Studio verwalten, wenn dies Ihr Ding ist. Nant scheint flexibler und besser geeignet zu sein, wenn Sie Skripte lieber von Hand schreiben möchten und wenn Sie aus der Java-Welt kommen, sind Sie wahrscheinlich genau richtig damit.

mmacaulay
quelle
Guter Punkt. Beide Lösungen können problemlos erweitert und auf jede gewünschte Weise angepasst werden.
CleverPatrick
2

Am Ende habe ich beide benutzt. Bei der Neugestaltung unseres Build-Systems hatte ich ein heikles Problem. Ich konnte nämlich .vcproj (und die Familie) nicht loswerden, weil wir alle VS verwendeten, um die Projektdateien, Einstellungen und Konfigurationen zu aktualisieren. Ohne einen großen Prozess der Vervielfältigung und Fehleranfälligkeit könnten wir unser Build-System nicht auf einen neuen Satz von Dateien stützen.

Aus diesem Grund habe ich beschlossen, die 'proj'-Dateien von VS beizubehalten und MSBuild zu verwenden (es handelt sich um MSBuild-Dateien, mindestens VS2005 und VS2008 verwenden MSBuild-Projektdateien). Für alles andere (benutzerdefinierte Konfiguration, Komponententests, Verpackung, Vorbereitung der Dokumentation ...) habe ich NAnt verwendet.

Für die kontinuierliche Integration habe ich CruiseControl verwendet. Wir hatten also CC-Skripte, die NAnt-Jobs auslösten, die zum Erstellen von MSBuild verwendet wurden.

Ein letzter Hinweis: MSBuild unterstützt KEINE Setup-Projekte! Sie müssen also nicht mehr DevEnv.com aufrufen oder Visual Studio direkt verwenden. Das habe ich letztendlich getan, aber ich habe das Setup-Projekt standardmäßig in allen Lösungskonfigurationen deaktiviert, da Entwickler sie normalerweise nicht erstellen müssten. Wenn dies der Fall ist, können sie sie manuell auswählen, um sie zu erstellen.

Asche
quelle
1

Die für NAnt verfügbaren Dokumentationen und Tutorials erleichtern das Erlernen von Build-Skripten mit NAnt. Nachdem ich NAnt verstanden und Build-Skripte erstellt hatte, begann ich, dieses Wissen in MSBuild zu übersetzen (ich habe X in NAnt gemacht, wie mache ich X in MSBuild?). Die Dokumentation von Microsoft setzt normalerweise ein ziemlich hohes Maß an Wissen voraus, bevor es nützlich ist.

Der Grund für den Wechsel von NAnt zu MSBuild ist, dass MSBuild aktueller ist. Leider war die letzte Veröffentlichung von NAnt am 8. Dezember 2007, während MSBuild 4.0 (.NET 4.0) nicht mehr weit ist. Es sieht so aus, als wäre das NAnt-Projekt gestorben.

Wenn Sie eine gute Dokumentation für jemanden finden, der gerade erst anfängt, das Erstellen von Build-Skripten mit MSBuild zu lernen, überspringen Sie NAnt und gehen Sie direkt zu MSBuild. Wenn NAnt jemals eine neue Version herausbringt, würde ich in Betracht ziehen, bei NAnt zu bleiben, aber sie bleiben jetzt zurück.

mcdon
quelle
1
Ab Juni 2012 ist Version 0.92 von NAnt auf der Website verfügbar: nant.sourceforge.net UND unterstützt .Net 4.0.
Brett Rigby
0

Wir benutzen beide. NAnt ist für alle "Scripting" -Dinge verantwortlich, wie das Kopieren und Bereitstellen auf IIS , Erstellen von Paketen, und MSBuild ist für das Erstellen der Lösung verantwortlich. Dann können wir Probleme mit nicht unterstütztem .NET 4.0 durch eine neue Version von NAnt vermeiden.

NAnt ist auch skalierbarer. Wenn wir die Bereitstellungsskripte auf Produktionsserver migrieren möchten, kopieren wir nur die Build-Datei und installieren eine ordnungsgemäße Version von .NET - keine Visual Studio-Probleme mit csproj-Dateien :)

Leszek Wachowicz
quelle
0

YDeliver von Manoj ist ein Build-Framework, das auf PSake basiert. Es verfügt über eine Vielzahl von Bibliotheksfunktionen und die Möglichkeit, Workflows zu definieren. Wir haben damit über sechs Unternehmensprojekte für die Produktion bereitgestellt.

Verwenden Sie es in Verbindung mit TeamCity , CruiseControl oder allem, was PowerShell ausführen kann .

Zasz
quelle
0

Wir verwenden FlubuCore. Es ist eine Open-Source-C # -Bibliothek zum Erstellen von Projekten und Ausführen von Bereitstellungsskripten mit C # -Code.

Einfaches Beispiel für die Verwendung von Flubu:

protected override void ConfigureTargets(ITaskContext session)
{           

    var compile = session.CreateTarget("compile")
        .SetDescription("Compiles the solution.")
        .AddTask(x => x.CompileSolutionTask())
        .DependsOn("generate.commonassinfo");
}

Weitere Informationen zu flubu und den ersten Schritten finden Sie hier: Auswahl-für-Build-Tool-msbuild-nant-oder-etwas-anderes

Stan88
quelle