أطر CLI لتطوير Kotlin: إنشاء تطبيقات وحدة تحكم قوية
Kotlin هي لغة حديثة تُستخدم بنشاط ليس فقط لتطوير Android، ولكن أيضًا لإنشاء تطبيقات الخادم وتطبيقات وحدة التحكم. يمكن تبسيط تطوير أدوات CLI (واجهة سطر الأوامر) باستخدام Kotlin بشكل كبير بمساعدة أطر متخصصة. في هذه المقالة، سنستعرض ثلاثة من أشهر الحلول: Clikt وKotlinx-cli وAigrette، وسنحللها من خلال أمثلة عملية.
لماذا نحتاج إلى إطار CLI؟
كتابة محلل وسائط سطر الأوامر يدويًا هي مهمة شاقة وعرضة للأخطاء. توفر أطر CLI ما يلي:
- تحليل تلقائي للوسائط والخيارات
- إنشاء تعليمات (
--help) - التحقق من صحة البيانات المدخلة
- دعم الأوامر الفرعية (subcommands)
- معالجة الأخطاء مع رسائل مفهومة
Clikt — الخيار الأكثر شيوعًا
Clikt هي مكتبة قوية ومرنة أصبحت المعيار الفعلي لـ CLI في Kotlin. تستخدم نهجًا تصريحيًا مع التعليقات التوضيحية وتوفر واجهة برمجة تطبيقات غنية.
التثبيت (عبر Gradle):
implementation("com.github.ajalt.clikt:clikt:4.2.1")مثال لتطبيق بسيط:
import com.github.ajalt.clikt.core.CliktCommandimport com.github.ajalt.clikt.parameters.arguments.argumentimport com.github.ajalt.clikt.parameters.options.optionimport com.github.ajalt.clikt.parameters.types.int
class Greet : CliktCommand() { val name by argument() val count by option("--count", "-c", help = "عدد التكرارات").int().default(1)
override fun run() { repeat(count) { echo("مرحبًا، $name!") } }}
fun main(args: Array<String>) = Greet().main(args)التشغيل:
./app --count 3 إيفان# المخرجات:# مرحبًا، إيفان!# مرحبًا، إيفان!# مرحبًا، إيفان!يدعم Clikt الأوامر المتداخلة، والإكمال التلقائي، والألوان في وحدة التحكم، والكتابة الصارمة. بالنسبة للمشاريع المعقدة (مثل أدوات DevOps، والأدوات المساعدة للعمل مع API)، هذا هو الخيار الأفضل.
Kotlinx-cli — حل خفيف من JetBrains
Kotlinx-cli هي مكتبة رسمية من مبتكري Kotlin. إنها أقل وظيفية من Clikt، لكنها مثالية للأدوات المساعدة البسيطة والمشاريع الصغيرة.
التثبيت:
implementation("org.jetbrains.kotlinx:kotlinx-cli:0.3.6")مثال:
import kotlinx.cli.*
fun main(args: Array<String>) { val parser = ArgParser("file-util") val input by parser.argument(ArgType.String, description = "ملف الإدخال") val output by parser.option(ArgType.String, shortName = "o", description = "ملف الإخراج").default("out.txt") val verbose by parser.option(ArgType.Boolean, shortName = "v", description = "إخراج مفصل").default(false)
parser.parse(args)
println("نقرأ من: $input") println("نكتب إلى: $output") if (verbose) println("الوضع المفصل مفعل")}لا يتطلب Kotlinx-cli تبعيات إضافية وهو ممتاز للنمذجة السريعة. ومع ذلك، فهو لا يدعم الأوامر المتداخلة والتحقق المعقد.
Aigrette — النهج الوظيفي
Aigrette هي مكتبة أقل شهرة ولكنها مثيرة للاهتمام، تستخدم الأسلوب الوظيفي. تعتمد على مفهوم "مجمعات المحلل".
التثبيت:
implementation("io.github.petertrr:aigrette:0.3.0")مثال:
import io.github.petertrr.aigrette.*
data class Config(val name: String, val age: Int, val flag: Boo