CLI-Frameworks für C# (.NET): Erstellung professioneller Konsolenanwendungen
Die moderne Entwicklung mit C# (.NET) beschränkt sich nicht nur auf Webanwendungen und Desktop-Programme. Konsolenanwendungen (CLI) sind weiterhin gefragt für Automatisierung, DevOps-Tools, Verwaltungsdienstprogramme und interne Skripte. Das manuelle Parsen von Befehlszeilenargumenten ist jedoch eine mühsame und fehleranfällige Aufgabe. Hier helfen spezialisierte CLI-Frameworks, die das Parsen von Argumenten, die Generierung von Hilfetexten, die Validierung und sogar die farbige Ausgabe übernehmen.
In diesem Artikel betrachten wir drei der beliebtesten Open-Source-Lösungen zur Erstellung von CLIs mit C# (.NET): System.CommandLine (offizielles Paket von Microsoft), Spectre.Console und Cocona. Sie erfahren mehr über deren wichtigste Funktionen, sehen Codebeispiele und können das passende Werkzeug für Ihr Projekt auswählen.
1. System.CommandLine (Microsoft)
System.CommandLine ist die offizielle Bibliothek von Microsoft zur Erstellung moderner Konsolenanwendungen mit umfassender Unterstützung für das Parsen von Argumenten, Validierung, automatische Vervollständigung und Hilfegenerierung. Sie wird aktiv im .NET SDK und anderen Microsoft-Tools eingesetzt.
Hauptfunktionen:
- Deklarative Definition von Befehlen, Optionen und Argumenten.
- Automatische Hilfegenerierung (--help).
- Unterstützung von Middleware für Fehlerbehandlung und Protokollierung.
- Integrierte Validierung von Typen und Werten.
- Möglichkeit der Integration mit Dependency Injection.
Codebeispiel:
using System.CommandLine;
var rootCommand = new RootCommand("Einfacher CLI-Rechner");
var argA = new Argument<int>("a", "Erste Zahl");var argB = new Argument<int>("b", "Zweite Zahl");var optMultiply = new Option<bool>("--multiply", "Multiplizieren statt Addieren");
rootCommand.AddArgument(argA);rootCommand.AddArgument(argB);rootCommand.AddOption(optMultiply);
rootCommand.SetHandler((int a, int b, bool multiply) =>{ int result = multiply ? a * b : a + b; Console.WriteLine($"Ergebnis: {result}");}, argA, argB, optMultiply);
await rootCommand.InvokeAsync(args);Aufruf: dotnet run -- 5 3 --multiply gibt Ergebnis: 15 aus.
2. Spectre.Console
Spectre.Console ist nicht nur ein CLI-Framework, sondern ein ganzes Ökosystem zur Erstellung schöner und interaktiver Konsolenanwendungen. Es umfasst das Parsen von Argumenten (über das Paket Spectre.Console.Cli), farbige Ausgabe, Tabellen, Fortschrittsbalken, Kalender und sogar Animationen.
Hauptfunktionen:
- Deklarative Definition von Befehlen mit Attributen.
- Automatische Hilfegenerierung mit farblicher Gestaltung.
- Integrierte Unterstützung für DI und Validierung.
- Umfangreiche Widget-Bibliothek: Tabellen, Bäume, Panels, Kalender.
- Interaktive Eingabeaufforderungen (Auswahl aus einer Liste, Bestätigung, Texteingabe).
Codebeispiel (Befehl mit Attributen):
using Spectre.Console;using Spectre.Console.Cli;
public class GreetCommand : Command<GreetSettings>{ public override int Execute(CommandContext context, GreetSettings settings) { AnsiConsole.MarkupLine($"[bold green]Hallo, {settings.Name}![/]"); if (settings.Repeat > 1) { AnsiConsole.MarkupLine($"[yellow]Wiederholt {settings.Repeat} Mal[/]"); } return 0; }}
public class GreetSettings : CommandSettings{ [CommandArgument(0, "[Name]")] public string Name { get; set; } = "Welt";
[CommandOption("-r|--repeat <N>")] public int Repeat { get; set; } = 1;}
// In Program.csvar app = new CommandApp<GreetCommand>();app.Run(args);Anf