Por que C# é ideal para ferramentas CLI e por que isso é importante para um desenvolvedor Python
\nQuando falamos sobre criar utilitários de console, a primeira coisa que vem à mente são Python, Bash ou Go. Mas e se eu dissesse que C# é uma das linguagens mais subestimadas para escrever ferramentas CLI rápidas, multiplataforma e elegantes? Sim, esse mesmo C# que muitos associam a formulários web e monstros corporativos.
\nCom o lançamento do .NET 6/8, o C# ganhou uma API mínima, compilação nativa (AOT) e uma biblioteca incrivelmente conveniente chamada System.CommandLine. Agora, criar um utilitário que funciona no Windows, Linux e macOS pode ser feito em apenas 15 minutos. Para estudantes e desenvolvedores que estão aprendendo Python, esta é uma ótima maneira de expandir seu kit de ferramentas e entender como os utilitários CLI funcionam em outras linguagens.
Neste artigo, não vamos apenas escrever um "Hello World". Vamos criar um utilitário completo para trabalhar com arquivos, capaz de analisar argumentos, exibir texto colorido, tratar erros e até mesmo mostrar uma barra de progresso. Vamos lá!
\n\nConfiguração do projeto: mínimo esforço
\nA primeira coisa a fazer é garantir que você tenha o .NET SDK instalado (versão 6.0 ou superior). Verifique facilmente:
\ndotnet --version\nSe estiver tudo certo, crie um novo projeto de console:
\ndotnet new console -n FileGuardian\ncd FileGuardian\nJá nesta etapa, obtemos um esqueleto pronto. Mas para um utilitário CLI de verdade, precisaremos de uma biblioteca para análise de argumentos. Adicione-a:
\ndotnet add package System.CommandLine --version 2.0.0-beta4.22272.1\nPronto. Agora temos tudo para criar um aplicativo de console profissional em C#.
\n\nPor que System.CommandLine e não análise manual?
\nMuitos iniciantes escrevem args[0], args[1] e pegam IndexOutOfRangeException. Esse é o caminho da dor. System.CommandLine oferece:
- \n
- Análise automática de flags (
--output,-o) \n - Dicas em caso de entrada incorreta \n
- Geração embutida de
--help\n - Suporte a subcomandos (como no git) \n
Isso é indispensável para qualquer utilitário de console C# sério.
\n\nEscrevendo o núcleo do utilitário: primeiro comando
\nImagine que estamos criando uma ferramenta para monitoramento de arquivos — FileGuardian. Ela verificará o tamanho dos arquivos e alertará se eles excederem o limite. Parece útil, certo?
\nAbra o Program.cs e escreva o seguinte:
using System.CommandLine;\n\nvar rootCommand = new RootCommand("FileGuardian — utilitário para monitoramento de arquivos");\n\nvar fileOption = new Option<FileInfo?>(\n name: "--file",\n description: "Caminho para o arquivo a ser analisado"\n);\nrootCommand.AddOption(fileOption);\n\nrootCommand.SetHandler((file) =>\n{\n if (file is null || !file.Exists)\n {\n Console.Error.WriteLine("❌ Arquivo não encontrado!");\n return;\n }\n \n long sizeInBytes = file.Length;\n double sizeInMb = sizeInBytes / (1024.0 * 1024.0);\n \n Console.WriteLine($"📄 Arquivo: {file.Name}");\n Console.WriteLine($"📏 Tamanho: {sizeInMb:F2} MB");\n \n if (sizeInMb > 100)\n Console.WriteLine("⚠️ Atenção: o arquivo excede 100 MB!");\n}, fileOption);\n\nawait rootCommand.InvokeAsync(args);\nExecute:
\ndotnet run -- --file somefile.txt\nJá está funcionando. Mas isso é só o começo. Vamos adicionar um toque especial — saída colorida e barra de progresso.
\n\nSaída bonita: adicionando cores e emojis
\nO console não precisa ser preto e branco. C# permite alterar facilmente as cores do texto. Vamos criar uma classe auxiliar:
\npublic static class ConsoleHelper\n{\n public static void WriteSuccess(string message)\n {\n Console.ForegroundColor = ConsoleColor.Green;\n Console.WriteLine($"✅ {message}"