إطار CLI للغة C++: cppcli — إنشاء تطبيقات وحدة التحكم

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

إطار 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

توصيات