إطار عمل CLI لـ C# (.NET): System.CommandLine و Spectre.Console
إنشاء تطبيقات وحدة تحكم (CLI) عالية الجودة بلغة C# هي مهمة لا تتطلب فقط معالجة وسائط سطر الأوامر، بل تتطلب أيضًا عرضًا مناسبًا للبيانات، ودعم الأوامر الفرعية، والتحقق من الصحة، والتفاعل. في نظام .NET البيئي، توجد أداتان قويتان لهذا الغرض: System.CommandLine الرسمي من Microsoft والمكتبة الشاملة Spectre.Console. في هذه المقالة، سنقوم بتحليل إمكانياتهما بالتفصيل، ونعرض أمثلة على الاستخدام، ونقارن بين النهجين.
1. System.CommandLine: المحلل الرسمي من Microsoft
System.CommandLine هي مكتبة مفتوحة المصدر توفر طريقة تعريفية لتحديد الأوامر والوسائط والخيارات والمعالجات. وهي جزء من .NET SDK (بدءًا من .NET 6) ومتاحة كحزمة NuGet.
الإمكانيات الرئيسية
- وصف تعريفي لهيكل الأوامر باستخدام السمات أو واجهة fluent API.
- توليد تلقائي للتعليمات (
--help). - دعم الأوامر المتداخلة (subcommands) والأسماء المستعارة.
- التحقق من صحة الوسائط والخيارات (الأنواع، النطاقات، الإلزامية).
- التكامل مع حاويات DI والبرمجيات الوسيطة (middleware).
مثال: تطبيق بسيط بأمرين
لنقم بإنشاء تطبيق وحدة تحكم يدعم الأمرين greet و calc.
using System.CommandLine;
var rootCommand = new RootCommand("تطبيق CLI متعدد الوظائف");
// الأمر greetvar greetCommand = new Command("greet", "تحية المستخدم");var nameOption = new Option<string>( "--name", () => "العالم", "الاسم للتحية");greetCommand.AddOption(nameOption);
greetCommand.SetHandler((string name) =>{ Console.WriteLine($"مرحبًا، {name}!");}, nameOption);
// الأمر calcvar calcCommand = new Command("calc", "آلة حاسبة بسيطة");var aArgument = new Argument<int>("a", "الرقم الأول");var bArgument = new Argument<int>("b", "الرقم الثاني");var operationOption = new Option<string>( "--operation", () => "add", "العملية: 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("عملية غير معروفة") }; Console.WriteLine($"النتيجة: {result}");}, aArgument, bArgument, operationOption);
rootCommand.AddCommand(greetCommand);rootCommand.AddCommand(calcCommand);
return await rootCommand.InvokeAsync(args);تشغيل التطبيق:
dotnet run -- greet --name "PythonLib"dotnet run -- calc 10 5 --operation mul2. Spectre.Console: الجمال والتفاعل
Spectre.Console هي مكتبة لإنشاء واجهات وحدة تحكم جميلة. إنها لا تحل محل محلل الوسائط، ولكنها تكملها بشكل ممتاز: إخراج ملون، جداول، أشرطة تقدم، قوائم تفاعلية، وحتى الرسم في وحدة التحكم.
الإمكانيات الرئيسية
- إخراج ملون ومنسق مع دعم Markdown.
- جداول، رسوم بيانية، تقاويم.
- مكونات تفاعلية: اختيار من قائمة، إدخال نص، تأكيد.
- رسوم متحركة (مؤشرات دوارة، أشرطة تقدم).
- رسم إطارات، لوحات، وأعمدة.
مثال: قائمة تفاعلية وجدول
سنعرض كيفية إنشاء قائمة اختيار وعرض البيانات في شكل جدول.
using Spectre.Console;
// قائمة تفاعليةvar choice = AnsiConsole.Prompt( new SelectionProm