CLI фреймворки для C# (.NET): System.CommandLine и Cocona

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

CLI фреймворки для C# (.NET): System.CommandLine и Cocona

Создание консольных приложений (CLI) на C# долгое время было связано с ручным парсингом аргументов командной строки через string[] args и громоздкими условными конструкциями. Однако с развитием экосистемы .NET появились специализированные фреймворки, которые берут на себя рутину: разбор аргументов, генерацию справки, валидацию и даже внедрение зависимостей (DI). В этой статье мы рассмотрим два наиболее популярных подхода: официальный System.CommandLine от Microsoft и лёгкий, но мощный Cocona.

Оба инструмента позволяют писать чистый, декларативный код, который легко поддерживать и тестировать. Вы узнаете, как быстро подключить их к проекту, определить команды и аргументы, а также увидите реальные примеры кода.

1. System.CommandLine

System.CommandLine — это официальная библиотека от Microsoft, входящая в состав .NET SDK (начиная с .NET 6). Она предоставляет полный набор функций для построения сложных CLI-приложений: вложенные команды, автодополнение по Tab, валидацию, асинхронные обработчики и генерацию справки.

Установка

Добавьте пакет через NuGet:

dotnet add package System.CommandLine --version 2.0.0-beta4.22272.1

Пример: калькулятор с двумя операциями

Создадим простое приложение, которое принимает команду add или multiply с двумя числами:

using System.CommandLine;

// Определяем корневую команду
var rootCommand = new RootCommand("Простой калькулятор");

// Создаём подкоманду "add"
var addCommand = new Command("add", "Сложение двух чисел");
var addXOption = new Option<int>("--x", "Первое число") { IsRequired = true };
var addYOption = new Option<int>("--y", "Второе число") { IsRequired = true };
addCommand.AddOption(addXOption);
addCommand.AddOption(addYOption);

addCommand.SetHandler((x, y) =>
{
    Console.WriteLine($"Результат сложения: {x + y}");
}, addXOption, addYOption);

// Создаём подкоманду "multiply"
var multiplyCommand = new Command("multiply", "Умножение двух чисел");
var multXOption = new Option<int>("--x", "Первое число") { IsRequired = true };
var multYOption = new Option<int>("--y", "Второе число") { IsRequired = true };
multiplyCommand.AddOption(multXOption);
multiplyCommand.AddOption(multYOption);

multiplyCommand.SetHandler((x, y) =>
{
    Console.WriteLine($"Результат умножения: {x * y}");
}, multXOption, multYOption);

// Добавляем команды в корень
rootCommand.AddCommand(addCommand);
rootCommand.AddCommand(multiplyCommand);

// Запускаем
await rootCommand.InvokeAsync(args);

Запуск приложения:

dotnet run -- add --x 5 --y 3
# Вывод: Результат сложения: 8

dotnet run -- multiply --x 4 --y 7
# Вывод: Результат умножения: 28

Ключевые возможности System.CommandLine

  • Автодополнение — встроенная поддержка Tab-завершения для bash и PowerShell.
  • Генерация справки — флаг --help автоматически формирует описание всех команд и опций.
  • Валидация — можно задавать обязательные параметры, диапазоны значений и кастомные проверки.
  • Асинхронность — обработчики поддерживают async Task.
  • Тестирование — легко писать unit-тесты с помощью TestConsole.

2. Cocona

Cocona — это альтернативный фреймворк, который предлагает более лаконичный синтаксис благодаря атрибутам и автоматическому связыванию параметров. Он идеально подходит для небольших и средних проектов, где важна скорость разработки. Cocona поддерживает DI, middleware и вложенные команды.

Установка

dotnet add package Cocona

Пример: тот же калькулятор с Cocona

Код становится заметно короче:

using Cocona;

// Создаём приложение
var app = CoconaApp.Create();

// Определяем команды с помощью атрибутов
app.AddCommand("add", ([Argument] int x, [Argument] int y) =>
{
    Console.WriteLine($"Ре                    

Рекомендаций