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($"Ре