CLI framework para C# (.NET): System.CommandLine y Spectre.Console
Crear aplicaciones de consola (CLI) de calidad en C# es una tarea que requiere no solo procesar argumentos de línea de comandos, sino también una presentación conveniente de datos, soporte para subcomandos, validación e interactividad. En el ecosistema .NET existen dos herramientas potentes para esto: el oficial System.CommandLine de Microsoft y la biblioteca universal Spectre.Console. En este artículo analizaremos en detalle sus capacidades, mostraremos ejemplos de uso y compararemos sus enfoques.
1. System.CommandLine: el analizador oficial de Microsoft
System.CommandLine es una biblioteca de código abierto que proporciona una forma declarativa de definir comandos, argumentos, opciones y manejadores. Forma parte del .NET SDK (desde .NET 6) y está disponible como paquete NuGet.
Características principales
- Descripción declarativa de la estructura de comandos mediante atributos o fluent API.
- Generación automática de ayuda (
--help). - Soporte para comandos anidados (subcomandos) y alias.
- Validación de argumentos y opciones (tipos, rangos, obligatoriedad).
- Integración con contenedores DI y middleware.
Ejemplo: aplicación simple con dos comandos
Crearemos una aplicación de consola que soporte los comandos greet y calc.
using System.CommandLine;
var rootCommand = new RootCommand("Aplicación CLI multifuncional");
// Comando greetvar greetCommand = new Command("greet", "Saludar al usuario");var nameOption = new Option<string>( "--name", () => "mundo", "Nombre para el saludo");greetCommand.AddOption(nameOption);
greetCommand.SetHandler((string name) =>{ Console.WriteLine($"¡Hola, {name}!");}, nameOption);
// Comando calcvar calcCommand = new Command("calc", "Calculadora simple");var aArgument = new Argument<int>("a", "Primer número");var bArgument = new Argument<int>("b", "Segundo número");var operationOption = new Option<string>( "--operation", () => "add", "Operación: 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("Operación desconocida") }; Console.WriteLine($"Resultado: {result}");}, aArgument, bArgument, operationOption);
rootCommand.AddCommand(greetCommand);rootCommand.AddCommand(calcCommand);
return await rootCommand.InvokeAsync(args);Ejecución de la aplicación:
dotnet run -- greet --name "PythonLib"dotnet run -- calc 10 5 --operation mul2. Spectre.Console: belleza e interactividad
Spectre.Console es una biblioteca para crear interfaces de consola atractivas. No reemplaza al analizador de argumentos, pero lo complementa perfectamente: salida en color, tablas, barras de progreso, menús interactivos e incluso dibujo en la consola.
Características principales
- Salida en color y formateada con soporte para Markdown.
- Tablas, diagramas, calendarios.
- Componentes interactivos: selección de lista, entrada de texto, confirmación.
- Animación (spinners, barras de progreso).
- Dibujo de bordes, paneles y columnas.
Ejemplo: menú interactivo y tabla
Mostraremos cómo crear un menú de selección y mostrar datos en forma de tabla.
using Spectre.Console;
// Menú interactivovar choice = AnsiConsole.Prompt( new SelectionProm