إطار عمل CLI لـ Swift: إنشاء أدوات سطر أوامر قوية لنظامي iOS و macOS
Swift ليست مجرد لغة لتطبيقات الهواتف المحمولة. مع ظهور Swift Package Manager (SPM) وأطر العمل مثل ArgumentParser، أصبح بإمكان المطورين إنشاء أدوات سطر أوامر كاملة لنظام macOS وحتى لنظام iOS (في إطار عمليات الخادم أو CI/CD). تسمح أطر عمل CLI (واجهة سطر الأوامر) لـ Swift بتحليل وسائط سطر الأوامر، ومعالجة العلامات (flags) والخيارات (options) والأوامر الفرعية (subcommands)، بالإضافة إلى إنشاء تعليمات مساعدة تلقائية.
في هذه المقالة، سنشرح بالتفصيل أحد أشهر أطر عمل CLI الرسمية وهو Swift ArgumentParser (من تطوير Apple). ستتعلم كيفية تثبيته عبر SPM، وكتابة أداة سطر أوامر بسيطة، وإضافة أوامر فرعية ووسائط، بالإضافة إلى رؤية أمثلة على الكود لمهام واقعية.
ما هو إطار عمل CLI لـ Swift؟
إطار عمل CLI هو مكتبة تتولى المهام الروتينية لتحليل سطر الأوامر. بدلاً من كتابة حلقات يدوية على CommandLine.arguments، تقوم بوصف هيكل الأمر بشكل تصريحي: أي الوسائط إلزامية، وأيها اختيارية، وأي العلامات مدعومة. يقوم الإطار تلقائياً بإنشاء التعليمات المساعدة (--help) ومعالجة أخطاء الإدخال.
الإمكانيات الرئيسية لـ Swift ArgumentParser:
- وصف تصريحي للوسائط والخيارات
- توليد تلقائي للتعليمات المساعدة وإصدار البرنامج
- دعم الأوامر الفرعية (مثل
git commitأوswift build) - التحقق من صحة الأنواع (Int, String, Double وأنواع مخصصة)
- التكامل مع SPM و Xcode
التثبيت عبر Swift Package Manager
أضف التبعية في ملف Package.swift الخاص بمشروعك:
// swift-tools-version:5.9import PackageDescription
let package = Package( name: "MyCLITool", dependencies: [ .package(url: "https://github.com/apple/swift-argument-parser.git", from: "1.2.0") ], targets: [ .executableTarget( name: "MyCLITool", dependencies: [ .product(name: "ArgumentParser", package: "swift-argument-parser") ] ) ])الآن قم بتنفيذ swift build - سيتم تحميل المكتبة وترجمتها.
كتابة الأمر الأول
لنقم بإنشاء أداة بسيطة ترحب بالمستخدم باسمه وعمره.
import ArgumentParser
struct Greet: ParsableCommand { @Argument(help: "اسم المستخدم") var name: String
@Option(name: .shortAndLong, help: "العمر") var age: Int?
mutating func run() throws { if let age = age { print("مرحباً، \\(name)! عمرك \\(age) سنة.") } else { print("مرحباً، \\(name)!") } }}
Greet.main()قم بتشغيل الملف الثنائي المترجم:
./MyCLITool "آنا" --age 25# الإخراج: مرحباً، آنا! عمرك 25 سنة.
./MyCLITool "مكسيم"# الإخراج: مرحباً، مكسيم!التعليمات المساعدة التي تم إنشاؤها تلقائياً (--help) ستظهر جميع الوسائط والخيارات.
الأوامر الفرعية: هيكل يشبه الأدوات الحقيقية
غالباً ما تحتوي أدوات CLI على عدة أوامر فرعية: create، delete، list. يدعم ArgumentParser ذلك بشكل مدمج.
import ArgumentParser
struct TaskManager: ParsableCommand { static var configuration = CommandConfiguration( subcommands: [Add.self, List.self, Delete.self] )}
struct Add: ParsableCommand { @Argument(help: "نص المهمة") var text: String
func run() { print("تمت إضافة المهمة: \\(text)") }}
struct List: ParsableCommand { func run() { print("قائمة المهام:")