إطار CLI للغة C++: cppcli — إنشاء تطبيقات وحدة تحكم قوية
غالبًا ما يتطلب تطوير واجهات سطر الأوامر (CLI) بلغة C++ تحليلًا يدويًا للوسائط، ومعالجة العلامات، وتنظيم الأوامر. توفر مكتبة cppcli إطارًا جاهزًا لإنشاء تطبيقات CLI احترافية بسرعة. تتيح لك التركيز على منطق الأعمال بدلاً من البنية التحتية للإدخال/الإخراج. في هذه المقالة، سنستعرض الميزات الرئيسية لـ cppcli، ونقدم أمثلة على الكود، ونوضح كيفية دمجها في مشروعك.
الميزات الرئيسية لـ cppcli
- تعريف الأوامر التصريحي — يتم وصف كل أمر كفئة منفصلة أو دالة لامدا.
- تحليل الوسائط التلقائي — دعم الوسائط الموضعية، المسماة، والعلامات.
- الإخراج الملون والتنسيق — أدوات مدمجة للإخراج المنسق (ألوان ANSI، جداول، أشرطة التقدم).
- التحقق والمساعدة — إنشاء تلقائي لرسائل المساعدة والتحقق من الوسائط الإلزامية.
- قابلية التوسع — دعم أنواع الوسائط المخصصة والبرمجيات الوسيطة.
بداية سريعة: التثبيت والمثال الأول
يتم توزيع cppcli كمكتبة header-only. للتثبيت، استنسخ المستودع أو استخدم CMake FetchContent. الإدراج في المشروع:
#include <cppcli/cli.h>#include <iostream>
int main(int argc, char* argv[]) { cppcli::App app("تطبيقي", "1.0.0"); app.run(argc, argv); return 0;}هذا هو الهيكل الأساسي. الآن سنضيف الأمر greet الذي يستقبل اسم المستخدم.
مثال: أمر مع وسائط
#include <cppcli/cli.h>
int main(int argc, char* argv[]) { cppcli::App app("Greeter", "1.0.0");
app.command("greet", "يرحب بالمستخدم") .argument<std::string>("name", "اسم المستخدم") .action([](const cppcli::Args& args) { std::string name = args.get<std::string>("name"); std::cout << "مرحبًا، " << name << "!"; });
app.run(argc, argv); return 0;}التشغيل: ./app greet إيفان سيطبع مرحبًا، إيفان!. إذا لم يتم تحديد الوسيطة، سيطبع cppcli خطأ ورسالة مساعدة.
العلامات والمعلمات الاختيارية
لنضف العلامة --formal للتحية الرسمية:
app.command("greet", "يرحب بالمستخدم") .argument<std::string>("name", "الاسم") .flag("--formal", "-f", "تحية رسمية") .action([](const cppcli::Args& args) { std::string name = args.get<std::string>("name"); bool formal = args.get<bool>("formal"); if (formal) std::cout << "أهلاً وسهلاً، " << name << "!"; else std::cout << "مرحبًا، " << name << "!"; });الآن ./app greet إيفان --formal سيطبع أهلاً وسهلاً، إيفان!.
الأوامر المتداخلة والأوامر الفرعية
يدعم cppcli هيكل شجري للأوامر. على سبيل المثال، لأداة إدارة المشاريع:
app.command("project", "إدارة المشاريع") .command("create", "إنشاء مشروع") .argument<std::string>("name", "اسم المشروع") .action([](const cppcli::Args& args) { std::cout << "تم إنشاء المشروع: " << args.get<std::string>("name") << ""; }) .command("delete", "حذف مشروع") .argument<std::string>("name", "اسم المشروع") .flag("--force", "بدون تأكيد") .action([](const cppcli::Args& args) { // منطق الحذف });الاستدعاء: ./app project
أيضاً في المكتبة
الجغرافيا المكانية والخرائط في Java: المكتبات، واجهات برمجة التطبيقات وأمثلة الكود
معالجة JSON في C# (.NET): دليل كامل لـ Newtonsoft.Json و System.Text.Json
دليل Psr/Log PHP الشامل: أمثلة واستخدام