Frameworks CLI para C# (.NET): System.CommandLine y Cocona
La creación de aplicaciones de consola (CLI) en C# durante mucho tiempo ha estado asociada con el análisis manual de argumentos de línea de comandos a través de string[] args y engorrosas construcciones condicionales. Sin embargo, con el desarrollo del ecosistema .NET, han surgido frameworks especializados que se encargan de las tareas rutinarias: análisis de argumentos, generación de ayuda, validación e incluso inyección de dependencias (DI). En este artículo, analizaremos los dos enfoques más populares: el oficial System.CommandLine de Microsoft y el ligero pero potente Cocona.
Ambas herramientas permiten escribir código limpio y declarativo que es fácil de mantener y probar. Aprenderá cómo agregarlas rápidamente a su proyecto, definir comandos y argumentos, y verá ejemplos de código reales.
1. System.CommandLine
System.CommandLine es la biblioteca oficial de Microsoft, que forma parte del SDK de .NET (a partir de .NET 6). Proporciona un conjunto completo de funciones para construir aplicaciones CLI complejas: comandos anidados, autocompletado con Tab, validación, controladores asíncronos y generación de ayuda.
Instalación
Agregue el paquete a través de NuGet:
dotnet add package System.CommandLine --version 2.0.0-beta4.22272.1Ejemplo: calculadora con dos operaciones
Creemos una aplicación simple que acepte el comando add o multiply con dos números:
using System.CommandLine;
// Definimos el comando raízvar rootCommand = new RootCommand("Calculadora simple");
// Creamos el subcomando "add"var addCommand = new Command("add", "Suma de dos números");var addXOption = new Option<int>("--x", "Primer número") { IsRequired = true };var addYOption = new Option<int>("--y", "Segundo número") { IsRequired = true };addCommand.AddOption(addXOption);addCommand.AddOption(addYOption);
addCommand.SetHandler((x, y) =>{ Console.WriteLine($"Resultado de la suma: {x + y}");}, addXOption, addYOption);
// Creamos el subcomando "multiply"var multiplyCommand = new Command("multiply", "Multiplicación de dos números");var multXOption = new Option<int>("--x", "Primer número") { IsRequired = true };var multYOption = new Option<int>("--y", "Segundo número") { IsRequired = true };multiplyCommand.AddOption(multXOption);multiplyCommand.AddOption(multYOption);
multiplyCommand.SetHandler((x, y) =>{ Console.WriteLine($"Resultado de la multiplicación: {x * y}");}, multXOption, multYOption);
// Agregamos los comandos a la raízrootCommand.AddCommand(addCommand);rootCommand.AddCommand(multiplyCommand);
// Ejecutamosawait rootCommand.InvokeAsync(args);Ejecución de la aplicación:
dotnet run -- add --x 5 --y 3# Salida: Resultado de la suma: 8
dotnet run -- multiply --x 4 --y 7# Salida: Resultado de la multiplicación: 28Características clave de System.CommandLine
- Autocompletado — soporte integrado para finalización con Tab en bash y PowerShell.
- Generación de ayuda — la bandera
--helpgenera automáticamente una descripción de todos los comandos y opciones. - Validación — se pueden definir parámetros obligatorios, rangos de valores y comprobaciones personalizadas.
- Asincronía — los controladores admiten
async Task. - Pruebas — fácil de escribir pruebas unitarias con
TestConsole.
2. Cocona
Cocona es un framework alternativo que ofrece una sintaxis más concisa gracias a los atributos y la vinculación automática de parámetros. Es ideal para proyectos pequeños y medianos donde la velocidad de desarrollo es importante. Cocona admite DI, middleware y comandos anidados.
Instalación
dotnet add package Co También en la biblioteca
Autorización y autenticación en Swift: guía completa para iOS/macOS
Trabajo con Markdown en Go: librerías blackfriday, goldmark y chroma
Rate Limiting en Rust: bibliotecas para limitar la frecuencia de solicitudes
Framework CLI para Swift: creación de utilidades de consola en iOS/macOS