Por qué C# es ideal para herramientas CLI y por qué es importante para un desarrollador de Python
\nCuando hablamos de crear utilidades de consola, lo primero que viene a la mente son Python, Bash o Go. Pero, ¿y si te dijera que C# es uno de los lenguajes más subestimados para escribir herramientas CLI rápidas, multiplataforma y atractivas? Sí, ese mismo C# que muchos asocian con formularios web y monstruos corporativos.
\nCon el lanzamiento de .NET 6/8, C# ha incorporado una API mínima, compilación nativa (AOT) y la increíblemente conveniente biblioteca System.CommandLine. Ahora, crear una utilidad que funcione en Windows, Linux y macOS es posible en solo 15 minutos. Para estudiantes y desarrolladores que aprenden Python, esta es una excelente manera de ampliar su conjunto de herramientas y comprender cómo funcionan las utilidades CLI en otros lenguajes.
En este artículo, no solo escribiremos un "Hola Mundo". Crearemos una utilidad completa para trabajar con archivos que pueda analizar argumentos, mostrar texto en color, manejar errores e incluso mostrar una barra de progreso. ¡Allá vamos!
\n\nConfiguración del proyecto: mínimo esfuerzo
\nLo primero que debe hacer es asegurarse de tener instalado el SDK de .NET (versión 6.0 o superior). Verificarlo es simple:
\ndotnet --version\nSi todo está bien, creamos un nuevo proyecto de consola:
\ndotnet new console -n FileGuardian\ncd FileGuardian\nYa en este paso, obtenemos un esqueleto listo. Pero para una utilidad CLI real, necesitaremos una biblioteca para analizar argumentos. La agregamos:
\ndotnet add package System.CommandLine --version 2.0.0-beta4.22272.1\nListo. Ahora tenemos todo para crear una aplicación de consola profesional en C#.
\n\n¿Por qué System.CommandLine y no el análisis manual?
\nMuchos principiantes escriben args[0], args[1] y se encuentran con IndexOutOfRangeException. Ese es el camino del dolor. System.CommandLine ofrece:
- \n
- Análisis automático de banderas (
--output,-o) \n - Sugerencias en caso de entrada incorrecta \n
- Generación incorporada de
--help\n - Soporte para subcomandos (como en git) \n
Esto es imprescindible para cualquier utilidad de consola C# seria.
\n\nEscribiendo el núcleo de la utilidad: primer comando
\nImagina que estamos creando una herramienta para monitorear archivos: FileGuardian. Verificará el tamaño de los archivos y advertirá si superan un límite. Suena útil, ¿verdad?
\nAbriremos Program.cs y escribiremos lo siguiente:
using System.CommandLine;\n\nvar rootCommand = new RootCommand("FileGuardian — utilidad para monitoreo de archivos");\n\nvar fileOption = new Option<FileInfo?>(\n name: "--file",\n description: "Ruta al archivo para analizar"\n);\nrootCommand.AddOption(fileOption);\n\nrootCommand.SetHandler((file) =>\n{\n if (file is null || !file.Exists)\n {\n Console.Error.WriteLine("❌ ¡Archivo no encontrado!");\n return;\n }\n \n long sizeInBytes = file.Length;\n double sizeInMb = sizeInBytes / (1024.0 * 1024.0);\n \n Console.WriteLine($"📄 Archivo: {file.Name}");\n Console.WriteLine($"📏 Tamaño: {sizeInMb:F2} MB");\n \n if (sizeInMb > 100)\n Console.WriteLine("⚠️ Atención: ¡el archivo supera los 100 MB!");\n}, fileOption);\n\nawait rootCommand.InvokeAsync(args);\nEjecutamos:
\ndotnet run -- --file somefile.txt\nYa funciona. Pero esto es solo el comienzo. Agreguemos un toque especial: salida en color y una barra de progreso.
\n\nSalida atractiva: agregando colores y emojis
\nLa consola no tiene por qué ser en blanco y negro. C# permite cambiar fácilmente los colores del texto. Crearemos una clase auxiliar:
\npublic static class ConsoleHelper\n{\n public static void WriteSuccess(string message)\n {\n Console.ForegroundColor = ConsoleColor.Green;\n Console.WriteLine($"✅ {message}"