Framework CLI para C# (.NET): System.CommandLine e Spectre.Console

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

CLI framework para C# (.NET): System.CommandLine e Spectre.Console



Criar aplicações de console (CLI) de qualidade em C# é uma tarefa que requer não apenas o processamento de argumentos de linha de comando, mas também uma apresentação conveniente de dados, suporte a subcomandos, validação e interatividade. No ecossistema .NET, existem duas ferramentas poderosas para isso: o oficial System.CommandLine da Microsoft e a biblioteca versátil Spectre.Console. Neste artigo, analisaremos detalhadamente seus recursos, mostraremos exemplos de uso e compararemos as abordagens.



1. System.CommandLine: o parser oficial da Microsoft



System.CommandLine é uma biblioteca de código aberto que fornece uma maneira declarativa de definir comandos, argumentos, opções e manipuladores. Ela faz parte do .NET SDK (a partir do .NET 6) e está disponível como um pacote NuGet.



Principais recursos

  • Descrição declarativa da estrutura de comandos usando atributos ou fluent API.
  • Geração automática de ajuda (--help).
  • Suporte a comandos aninhados (subcommands) e aliases.
  • Validação de argumentos e opções (tipos, intervalos, obrigatoriedade).
  • Integração com contêineres DI e middleware.


Exemplo: aplicação simples com dois comandos

Vamos criar uma aplicação de console que suporta os comandos greet e calc.



using System.CommandLine;

var rootCommand = new RootCommand("Aplicação CLI multifuncional");

// Comando greetvar greetCommand = new Command("greet", "Saudação ao usuário");var nameOption = new Option<string>( "--name", () => "mundo", "Nome para a saudação");greetCommand.AddOption(nameOption);

greetCommand.SetHandler((string name) =>{ Console.WriteLine($"Olá, {name}!");}, nameOption);

// Comando calcvar calcCommand = new Command("calc", "Calculadora simples");var aArgument = new Argument<int>("a", "Primeiro número");var bArgument = new Argument<int>("b", "Segundo número");var operationOption = new Option<string>( "--operation", () => "add", "Operação: 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("Operação desconhecida") }; Console.WriteLine($"Resultado: {result}");}, aArgument, bArgument, operationOption);

rootCommand.AddCommand(greetCommand);rootCommand.AddCommand(calcCommand);

return await rootCommand.InvokeAsync(args);


Executando a aplicação:

dotnet run -- greet --name "PythonLib"dotnet run -- calc 10 5 --operation mul


2. Spectre.Console: beleza e interatividade



Spectre.Console é uma biblioteca para criar interfaces de console bonitas. Ela não substitui o parser de argumentos, mas o complementa perfeitamente: saída colorida, tabelas, barras de progresso, menus interativos e até mesmo desenho no console.



Principais recursos

  • Saída colorida e formatada com suporte a Markdown.
  • Tabelas, gráficos, calendários.
  • Componentes interativos: seleção de lista, entrada de texto, confirmação.
  • Animação (spinners, barras de progresso).
  • Desenho de bordas, painéis e colunas.


Exemplo: menu interativo e tabela

Vamos mostrar como criar um menu de seleção e exibir dados em forma de tabela.



using Spectre.Console;

// Menu interativovar choice = AnsiConsole.Prompt( new SelectionProm

Recommendations