ما هو viper ولماذا هو مطلوب؟
Viper هي مكتبة قوية لإدارة التهيئة في التطبيقات بلغة Go (Golang). إنها تحل إحدى المهام الرئيسية في التطوير: الإدارة المركزية والمرنة لإعدادات التطبيق، بغض النظر عن مصدر البيانات. يدعم Viper العمل مع JSON وTOML وYAML وHCL وINI وenvfile ومتغيرات البيئة، مما يجعله خيارًا مثاليًا للخدمات المصغرة وأدوات سطر الأوامر وتطبيقات الويب.
الإمكانيات الرئيسية
- مصادر متعددة: القراءة من الملفات (JSON, YAML, TOML)، متغيرات البيئة، المخازن البعيدة (etcd, Consul) وحتى خيارات سطر الأوامر.
- الأولويات: الحل التلقائي للتعارضات — المصدر المحدد آخرًا له الأولوية القصوى.
- إعادة التحميل المباشر: إمكانية تتبع التغييرات في ملفات التهيئة دون إعادة تشغيل التطبيق (يتطلب إعدادات إضافية).
- دعم المفاتيح المتداخلة: الوصول إلى الإعدادات من خلال الترميز النقطي (مثل
app.db.host).
التثبيت
قم بتثبيت viper من خلال مدير الحزم القياسي لـ Go:
go get github.com/spf13/viperمثال كود بلغة Go
قم بإنشاء ملف config.yaml:
app: name: "MyApp" port: 8080database: host: "localhost" user: "admin" password: "secret"مثال على استخدام viper لقراءة التهيئة:
package main
import (\t"fmt"\t"github.com/spf13/viper")
func main() {\tviper.SetConfigName("config")\tviper.SetConfigType("yaml")\tviper.AddConfigPath(".")
\terr := viper.ReadInConfig()\tif err != nil {\t\tpanic(fmt.Errorf("خطأ في قراءة التهيئة: %w", err))\t}
\tappName := viper.GetString("app.name")\tport := viper.GetInt("app.port")\tdbHost := viper.GetString("database.host")
\tfmt.Printf("App: %s, Port: %d, DB: %s", appName, port, dbHost)}يمكن أيضًا استخدام متغيرات البيئة مع بادئة:
viper.SetEnvPrefix("MYAPP")viper.AutomaticEnv()// الآن سيكون المتغير MYAPP_APP_PORT متاحًا كـ app.portمتى يتم استخدام viper؟
- عند الحاجة إلى دعم تنسيقات تهيئة متعددة (YAML, JSON, TOML).
- للتطبيقات التي يمكن أن تتجاوز فيها الإعدادات بواسطة متغيرات البيئة (مثل Docker/Kubernetes).
- في بنية الخدمات المصغرة، حيث يمكن تحميل التهيئة من خدمات خارجية (etcd, Consul).
- إذا كنت بحاجة إلى تقسيم التهيئة لبيئات dev/staging/production.
Viper هو المعيار الفعلي لإدارة التهيئة في مجتمع Go، ويُستخدم في مشاريع مثل Hugo وDocker CLI والعديد من المشاريع الأخرى.