أطر CLI لـ Go (Golang): إنشاء تطبيقات وحدة تحكم احترافية
تعتبر لغة Go (Golang) بحق واحدة من أفضل اللغات لإنشاء الأدوات المساعدة لوحدة التحكم. بفضل التجميع السريع، والدعم المدمج لتعدد الخيوط، ونظام الحزم المريح، تمت كتابة أدوات أسطورية مثل Docker وKubernetes وHugo وTerraform بلغة Go. ومع ذلك، لإنشاء واجهة سطر أوامر (CLI) مريحة ومرنة حقًا، غالبًا ما تكون هناك حاجة ليس فقط إلى المكتبة القياسية flag، ولكن أيضًا إلى أطر متخصصة. في هذه المقالة، سنقوم بتحليل أفضل أطر CLI للغة Go، وإمكانياتها، ومزاياها، وأمثلة على استخدامها.
لماذا نحتاج إلى إطار CLI؟
المكتبة القياسية flag تؤدي المهام البسيطة بشكل ممتاز، ولكن عندما ينمو مشروعك، تظهر الحاجة إلى:
- دعم الأوامر المتداخلة (subcommands)، كما في
git commitأوdocker run. - التوليد التلقائي للتعليمات وصفحات man.
- الإكمال التلقائي (bash/zsh/fish completion).
- تحليل العلامات والوسائط المعقدة.
- وضع العمل التفاعلي (TUI).
ولهذه المهام تحديدًا توجد أطر CLI.
1. Cobra — ملك CLI في Go
Cobra هو الإطار الأكثر شيوعًا لإنشاء CLI بلغة Go. يُستخدم في Kubernetes وHugo وGitHub CLI والعديد من المشاريع الأخرى. يوفر Cobra واجهة قوية لإنشاء الأوامر والعلامات والوسائط.
الإمكانيات الرئيسية:
- إنشاء بسيط للأوامر المتداخلة.
- التوليد التلقائي للتعليمات وصفحات man.
- دعم الإكمال التلقائي لـ bash وzsh وfish وPowerShell.
- التكامل مع Viper (مدير التكوين).
- توليد هيكل المشروع عبر
cobra-cli init.
مثال برمجي باستخدام Cobra:
package main
import ( "fmt" "os"
"github.com/spf13/cobra")
func main() { var rootCmd = &cobra.Command{ Use: "greet", Short: "أداة ترحيب", Long: "أداة بسيطة لتحية المستخدم", Run: func(cmd *cobra.Command, args []string) { name, _ := cmd.Flags().GetString("name") if name == "" { name = "العالم" } fmt.Printf("مرحبًا، %s!", name) }, }
rootCmd.Flags().StringP("name", "n", "", "اسم المستخدم")
if err := rootCmd.Execute(); err != nil { fmt.Println(err) os.Exit(1) }}عند تشغيل هذا البرنامج مع العلامة --name "أحمد"، ستحصل على تحية. سيضيف Cobra تلقائيًا العلامة --help وتنسيقًا جميلًا للإخراج.
2. urfave/cli (سابقًا codegangsta/cli)
urfave/cli هو ثاني أكثر الأطر شيوعًا. يتميز بواجهة برمجة تطبيقات بسيطة وبديهية، موجهة نحو الوصف التصريحي للأوامر. مناسب تمامًا للمشاريع الصغيرة والمتوسطة.
المزايا:
- كود بسيط ومفهوم.
- دعم مدمج للعلامات والوسائط والأوامر الفرعية.
- التوليد التلقائي للتعليمات.
- دعم الإجراءات قبل وبعد تنفيذ الأمر (Before/After hooks).
مثال برمجي باستخدام urfave/cli:
package main
import ( "fmt" "log" "os"
"github.com/urfave/cli/v2")
func main() { app := &cli.App{ Name: "calculator", Usage: "آلة حاسبة بسيطة", Commands: []*cli.Command{ { Name: "add", Aliases: []string{"a"}, Usage: "جمع رقمين",