لماذا تعتبر C# مثالية لأدوات CLI، ولماذا هذا مهم لمطور Python
\nعندما نتحدث عن إنشاء أدوات وحدة التحكم، يتبادر إلى الذهن أولاً Python أو Bash أو Go. ولكن ماذا لو أخبرتك أن C# هي واحدة من أكثر اللغات التي لا تحظى بالتقدير الكافي لكتابة أدوات CLI سريعة ومتعددة المنصات وجميلة؟ نعم، نفس لغة C# التي يربطها الكثيرون بنماذج الويب والوحوش المؤسسية.
\nمع إصدار .NET 6/8، أصبحت C# تحتوي على واجهة برمجة تطبيقات بسيطة (Minimal API)، وتجميع أصلي (AOT)، ومكتبة مريحة بشكل لا يصدق System.CommandLine. الآن، يمكن إنشاء أداة تعمل على Windows وLinux وmacOS في 15 دقيقة حرفياً. بالنسبة للطلاب والمطورين الذين يتعلمون Python، هذه طريقة رائعة لتوسيع مجموعة أدواتهم وفهم كيفية عمل أدوات CLI بلغات أخرى.
في هذه المقالة، لن نكتب مجرد "Hello World". سننشئ أداة كاملة للعمل مع الملفات، قادرة على تحليل الوسائط، وعرض نص ملون، ومعالجة الأخطاء، وحتى إظهار شريط التقدم. هيا بنا!
\n\nإعداد المشروع: أقل قدر من الحركة
\nأول شيء يجب فعله هو التأكد من تثبيت .NET SDK (الإصدار 6.0 أو أعلى). التحقق بسيط:
\ndotnet --version\nإذا كان كل شيء على ما يرام، نقوم بإنشاء مشروع وحدة تحكم جديد:
\ndotnet new console -n FileGuardian\ncd FileGuardian\nفي هذه المرحلة، نحصل على هيكل عظمي جاهز. ولكن لأداة CLI حقيقية، سنحتاج إلى مكتبة لتحليل الوسائط. نضيفها:
\ndotnet add package System.CommandLine --version 2.0.0-beta4.22272.1\nتم. الآن لدينا كل ما يلزم لإنشاء تطبيق وحدة تحكم احترافي بلغة C#.
\n\nلماذا System.CommandLine بدلاً من التحليل اليدوي؟
\nيكتب العديد من المبتدئين args[0]، args[1] ويصطدمون بـ IndexOutOfRangeException. هذا طريق الألم. System.CommandLine تقدم:
- \n
- تحليل تلقائي للعلامات (
--output،-o) \n - تلميحات عند الإدخال غير الصحيح \n
- توليد مدمج لـ
--help - دعم الأوامر الفرعية (كما في git)
هذا أمر لا غنى عنه لأي أداة وحدة تحكم C# جادة.
\n\nكتابة نواة الأداة: الأمر الأول
\nتخيل أننا ننشئ أداة لمراقبة الملفات — FileGuardian. ستتحقق من حجم الملفات وتحذر إذا تجاوزت الحد المسموح. يبدو مفيداً، أليس كذلك؟
\nلنفتح Program.cs ونكتب ما يلي:
using System.CommandLine;\n\nvar rootCommand = new RootCommand("FileGuardian — أداة لمراقبة الملفات");\n\nvar fileOption = new Option<FileInfo?>(\n name: "--file",\n description: "المسار إلى الملف للتحليل"\n);\nrootCommand.AddOption(fileOption);\n\nrootCommand.SetHandler((file) =>\n{\n if (file is null || !file.Exists)\n {\n Console.Error.WriteLine("❌ الملف غير موجود!");\n return;\n }\n \n long sizeInBytes = file.Length;\n double sizeInMb = sizeInBytes / (1024.0 * 1024.0);\n \n Console.WriteLine($"📄 الملف: {file.Name}");\n Console.WriteLine($"📏 الحجم: {sizeInMb:F2} MB");\n \n if (sizeInMb > 100)\n Console.WriteLine("⚠️ تحذير: الملف يتجاوز 100 MB!");\n}, fileOption);\n\nawait rootCommand.InvokeAsync(args);\nنشغل:
\ndotnet run -- --file somefile.txt\nيعمل بالفعل. لكن هذه مجرد البداية. دعنا نضيف لمسة خاصة — إخراج ملون وشريط تقدم.
\n\nإخراج جميل: إضافة الألوان والرموز التعبيرية
\nوحدة التحكم ليست مضطرة لأن تكون أبيض وأسود. تسمح C# بتغيير ألوان النص بسهولة. لننشئ فئة مساعدة:
\npublic static class ConsoleHelper\n{\n public static void WriteSuccess(string message)\n {\n Console.ForegroundColor = ConsoleColor.Green;\n Console.WriteLine($"✅ {message}"