CLI-Framework für C# (.NET): System.CommandLine und Spectre.Console
Die Erstellung hochwertiger Konsolenanwendungen (CLI) in C# ist eine Aufgabe, die nicht nur die Verarbeitung von Befehlszeilenargumenten, sondern auch eine benutzerfreundliche Darstellung von Daten, Unterstützung für Unterbefehle, Validierung und Interaktivität erfordert. Im .NET-Ökosystem gibt es dafür zwei leistungsstarke Werkzeuge: das offizielle System.CommandLine von Microsoft und die vielseitige Bibliothek Spectre.Console. In diesem Artikel werden wir ihre Funktionen im Detail analysieren, Anwendungsbeispiele zeigen und die Ansätze vergleichen.
1. System.CommandLine: Offizieller Parser von Microsoft
System.CommandLine ist eine Open-Source-Bibliothek, die eine deklarative Möglichkeit zur Definition von Befehlen, Argumenten, Optionen und Handlern bietet. Sie ist Teil des .NET SDK (ab .NET 6) und als NuGet-Paket verfügbar.
Hauptfunktionen
- Deklarative Beschreibung der Befehlsstruktur mittels Attributen oder Fluent-API.
- Automatische Generierung der Hilfe (
--help). - Unterstützung für verschachtelte Befehle (Subcommands) und Aliase.
- Validierung von Argumenten und Optionen (Typen, Bereiche, Pflichtfelder).
- Integration mit DI-Containern und Middleware.
Beispiel: Einfache Anwendung mit zwei Befehlen
Wir erstellen eine Konsolenanwendung, die die Befehle greet und calc unterstützt.
using System.CommandLine;
var rootCommand = new RootCommand("Multifunktionale CLI-Anwendung");
// Befehl greetvar greetCommand = new Command("greet", "Benutzer begrüßen");var nameOption = new Option<string>( "--name", () => "Welt", "Name für die Begrüßung");greetCommand.AddOption(nameOption);
greetCommand.SetHandler((string name) =>{ Console.WriteLine($"Hallo, {name}!");}, nameOption);
// Befehl calcvar calcCommand = new Command("calc", "Einfacher Taschenrechner");var aArgument = new Argument<int>("a", "Erste Zahl");var bArgument = new Argument<int>("b", "Zweite Zahl");var operationOption = new Option<string>( "--operation", () => "add", "Operation: add, sub, mul, div");calcCommand.AddArgument(aArgument);calcCommand.AddArgument(bArgument);calcCommand.AddOption(operationOption);
calcCommand.SetHandler((int a, int b, string op) =>{ var result = op switch { "add" => a + b, "sub" => a - b, "mul" => a * b, "div" => b != 0 ? a / b : throw new DivideByZeroException(), _ => throw new ArgumentException("Unbekannte Operation") }; Console.WriteLine($"Ergebnis: {result}");}, aArgument, bArgument, operationOption);
rootCommand.AddCommand(greetCommand);rootCommand.AddCommand(calcCommand);
return await rootCommand.InvokeAsync(args);Starten der Anwendung:
dotnet run -- greet --name "PythonLib"dotnet run -- calc 10 5 --operation mul2. Spectre.Console: Schönheit und Interaktivität
Spectre.Console ist eine Bibliothek zur Erstellung ansprechender Konsolenoberflächen. Sie ersetzt keinen Argument-Parser, ergänzt ihn aber hervorragend: farbige Ausgabe, Tabellen, Fortschrittsbalken, interaktive Menüs und sogar Zeichnungen in der Konsole.
Hauptfunktionen
- Farbige und formatierte Ausgabe mit Markdown-Unterstützung.
- Tabellen, Diagramme, Kalender.
- Interaktive Komponenten: Auswahl aus einer Liste, Texteingabe, Bestätigung.
- Animationen (Spinner, Fortschrittsbalken).
- Zeichnen von Rahmen, Panels und Spalten.
Beispiel: Interaktives Menü und Tabelle
Wir zeigen, wie man ein Auswahlmenü erstellt und Daten in Tabellenform ausgibt.
using Spectre.Console;
// Interaktives Menüvar choice = AnsiConsole.Prompt( new SelectionProm Auch in der Bibliothek
Moment.js / Day.js für JavaScript (Node.js): Vollständiger Leitfaden mit Beispielen
Serialisierung von Objekten in Java: Vollständiger Leitfaden mit Beispielen
Bildverarbeitung in Rust: resize und crop mit image und imageproc
PDF-Generierung in Go: Überblick über Bibliotheken und Codebeispiele