Viper क्या है और इसकी आवश्यकता क्यों है?
Viper Go भाषा में एप्लिकेशन कॉन्फ़िगरेशन मैनेज करने के लिए सबसे लोकप्रिय लाइब्रेरी है। यह सेटिंग्स के साथ काम करने का एक सार्वभौमिक और लचीला तरीका प्रदान करता है, जो विभिन्न स्रोतों से आ सकती हैं: कॉन्फ़िगरेशन फ़ाइलें (JSON, TOML, YAML, HCL, INI, envfile), एनवायरनमेंट वेरिएबल्स, कमांड-लाइन फ़्लैग, रिमोट स्टोरेज (etcd, Consul) और यहां तक कि कोड में डिफ़ॉल्ट मान भी।
Viper की आवश्यकता क्यों है? आधुनिक डेवलपमेंट में कॉन्फ़िगरेशन शायद ही कभी स्थिर होता है। एप्लिकेशन अलग-अलग एनवायरनमेंट (dev, staging, production) में चल सकता है, अलग-अलग डेटाबेस, API-कुंजियाँ और पोर्ट का उपयोग कर सकता है। Viper कई मुख्य समस्याओं का समाधान करता है:
- पदानुक्रमित संरचना: सेटिंग्स को एक-दूसरे के अंदर नेस्ट करने की अनुमति देता है (जैसे,
database.host)। - स्रोतों की प्राथमिकता: स्पष्ट रूप से निर्धारित करता है कि किस स्रोत की अधिक प्राथमिकता है (जैसे, फ़्लैग एनवायरनमेंट वेरिएबल्स को ओवरराइड करते हैं)।
- ऑटोमैटिक बाइंडिंग: एनवायरनमेंट वेरिएबल्स को कॉन्फ़िगरेशन कीज़ से ऑटोमैटिक रूप से जोड़ सकता है।
- कई फ़ॉर्मेट का सपोर्ट: हर फ़ॉर्मेट के लिए अलग पार्सर लिखने की ज़रूरत नहीं है।
- टाइप सेफ्टी: मानों को सही टाइप में बदलने के लिए तरीके प्रदान करता है (
GetInt,GetString,GetBoolआदि)।
Viper माइक्रोसर्विसेज, वेब एप्लिकेशन, CLI-यूटिलिटीज़ और Go में किसी भी अन्य प्रोग्राम के लिए आदर्श है, जहाँ लचीली कॉन्फ़िगरेशन मैनेजमेंट की आवश्यकता होती है।
Viper की इंस्टॉलेशन
Viper को Go के मानक तरीके से इंस्टॉल किया जाता है — पैकेज मैनेजर go get के माध्यम से। सुनिश्चित करें कि आपके पास Go का वर्शन 1.18 या उससे ऊपर है।
go get github.com/spf13/viper
इस कमांड को चलाने के बाद, Viper आपकी go.mod फ़ाइल में जुड़ जाएगा। विशिष्ट फ़ाइल फ़ॉर्मेट (जैसे YAML) के साथ काम करने के लिए आपको अतिरिक्त लाइब्रेरी की आवश्यकता हो सकती है, लेकिन Viper JSON, TOML और YAML के लिए बेसिक सपोर्ट "आउट ऑफ़ द बॉक्स" प्रदान करता है। यदि आप go mod का उपयोग कर रहे हैं, तो डिपेंडेंसीज़ ऑटोमैटिक रूप से डाउनलोड हो जाएँगी।
कोड में इम्पोर्ट का उदाहरण:
import (
"github.com/spf13/viper"
)
त्वरित शुरुआत: Viper के साथ पहला उदाहरण
चलिए एक सरल प्रोग्राम लिखते हैं जो config.yaml फ़ाइल से कॉन्फ़िगरेशन पढ़ता है और एक ग्रीटिंग प्रिंट करता है।
एक config.yaml फ़ाइल बनाएँ:
app:
name: "MyApp"
version: "1.0.0"
server:
port: 8080
अब एक main.go फ़ाइल बनाएँ:
package main
import (
"fmt"
"log"
"github.com/spf13/viper"
)
func main() {
// कॉन्फ़िगरेशन फ़ाइल का नाम सेट करें
viper.SetConfigName("config")
// फ़ाइल का टाइप सेट करें
viper.SetConfigType("yaml")
// सर्च पथ जोड़ें
viper.AddConfigPath(".")
// कॉन्फ़िगरेशन पढ़ें
if err := viper.ReadInConfig(); err != nil {
log.Fatalf("कॉन्फ़िगरेशन पढ़ने में त्रुटि: %s", err)
}
// मान प्राप्त करें
appName := viper.GetString("app.name")
appVersion := viper.GetString("app.version")
port := viper.GetInt("server.port")
fmt.Printf("एप्लिकेशन: %s (वर्शन %s) पोर्ट %d पर चल रहा है\n", appName, appVersion, port)
}
प्रोग्राम चलाएँ:
go run main.go
आउटपुट:
एप्लिकेशन: MyApp (वर्शन 1.0.0) पोर्ट 8080 पर चल रहा है
यह सरल उदाहरण मूल मैकेनिज्म को दर्शाता है: हम Viper को बताते हैं कि फ़ाइल कहाँ खोजनी है, उसे पढ़ते हैं, और फिर कीज़ के आधार पर मान निकालते हैं।
Viper के मुख्य तरीके और फ़ंक्शन
Viper एक समृद्ध API प्रदान करता है। नीचे हम विस्तृत विवरण और उदाहरणों के साथ 10 मुख्य तरीकों पर चर्चा करेंगे।
1. SetConfigName
क्या करता है: कॉन्फ़िगरेशन फ़ाइल का नाम सेट करता है (एक्सटेंशन के बिना