إطار عمل CLI لـ Swift: إنشاء أدوات سطر الأوامر على iOS و macOS
ظل تطوير تطبيقات سطر الأوامر (CLI — Command Line Interface) للنظام البيئي لـ Apple لفترة طويلة حكراً على Python أو Ruby أو Bash. ومع ذلك، مع ظهور Swift ومجموعة أدواته القوية، بما في ذلك Swift Package Manager (SPM)، أصبح من الممكن إنشاء أدوات سطر أوامر سريعة ومكتوبة بقواعد كتابة صارمة وسهلة الصيانة باللغة الأصلية لـ iOS/macOS. في هذه المقالة، سنستعرض بالتفصيل الإطار الرئيسي لبناء CLI على Swift — Apple's ArgumentParser، بالإضافة إلى الحلول البديلة.
ما هو إطار عمل CLI لـ Swift؟
إطار عمل CLI هو مكتبة تتولى المهام الروتينية لتحليل وسائط سطر الأوامر، وإنشاء التعليمات، ومعالجة الأخطاء، وتنظيم الأوامر. في عالم Swift، المعيار الفعلي هو ArgumentParser، الذي طورته Apple وهو جزء من Swift Open Source. يسمح لك بوصف واجهة أداتك بشكل تصريحي، ويقوم هو بكل شيء آخر تلقائياً.
الإمكانيات الرئيسية لـ ArgumentParser:
- تعريف الأوامر بشكل تصريحي — تصف الهيكل، ويقوم الإطار بتحليل الوسائط بنفسه.
- تعليمات تلقائية — يتم إنشاء العلامات
--helpو-hتلقائياً. - دعم الأوامر المتداخلة (كما في
gitأوswift). - التحقق من صحة الأنواع — إذا كان متوقعاً رقم وتم إدخال نص، فسيتم عرض خطأ مفهوم.
- التكامل مع SPM — يكفي إضافة تبعية في
Package.swift.
التثبيت والإعداد
للعمل، ستحتاج إلى Swift 5.5+ (يوصى باستخدام 5.7 أو أحدث). أنشئ مشروع سطر أوامر جديد عبر SPM:
mkdir MyCLIcd MyCLIswift package init --type executableثم قم بتحرير Package.swift، بإضافة تبعية لـ ArgumentParser:
// swift-tools-version:5.7import PackageDescription
let package = Package( name: "MyCLI", dependencies: [ .package(url: "https://github.com/apple/swift-argument-parser.git", from: "1.2.0") ], targets: [ .executableTarget( name: "MyCLI", dependencies: [ .product(name: "ArgumentParser", package: "swift-argument-parser") ] ) ])الآن قم بتحديث التبعيات وافتح المشروع:
swift package updateopen Package.swift # سيفتح في Xcodeإنشاء الأمر الأول
أنشئ ملف main.swift (أو Sources/MyCLI/main.swift) بالمحتوى التالي:
import ArgumentParser
struct Greet: ParsableCommand { static let configuration = CommandConfiguration( abstract: "تحية المستخدم", discussion: "هذا الأمر يطبع تحية مخصصة." )
@Argument(help: "اسم المستخدم") var name: String
@Option(name: .shortAndLong, help: "عدد مرات التكرار") var count: Int = 1
@Flag(name: .shortAndLong, help: "إظهار الإصدار") var verbose: Bool = false
mutating func run() throws { if verbose { print("الإصدار 1.0.0") } for _ in 0..<count { print("مرحباً، \\(name)!") } }}
Greet.main()الآن قم ببناء وتشغيل:
swift run MyCLI Swift --count 3# الإخراج:# مرحباً، Swift!# مرحباً، Swift!# مرحباً، Swift!
swift run MyCLI --help# الاستخدام: MyCLI <name> [--count <count>] [--verbose]# تحية المستخدم# ...الأوامر المتداخلة (الأوامر الفرعية)
لإنشاء أدوات معقدة (مثل