irfo
Moderatör
- Katılım
- 7 Ocak 2026
- Mesajlar
- 183
- Tepkime puanı
- 2
- Puanları
- 18
Go projelerinde yapılandırma (configuration) yönetimi dendiğinde akla gelen ilk ve en güçlü kütüphane Viper'dır. Viper; JSON, TOML, YAML, HCL, env dosyaları ve hatta uzak anahtar/değer sistemlerini (etcd, Consul) destekleyen "her şeyi kapsayan" bir çözüm sunar.
Profesyonel bir Go projesinde yapılandırmayı kodun içine gömmek yerine Viper ile dinamik ve esnek bir yapı kurmak, uygulamanızın farklı ortamlarda (Local, Dev, Prod) sorunsuz çalışmasını sağlar.
Go
Go
Go
Go
Profesyonel bir Go projesinde yapılandırmayı kodun içine gömmek yerine Viper ile dinamik ve esnek bir yapı kurmak, uygulamanızın farklı ortamlarda (Local, Dev, Prod) sorunsuz çalışmasını sağlar.
1. Viper'ın Temel Özellikleri
Viper, yapılandırma verilerini belirli bir öncelik sırasına göre arar. Bu hiyerarşi, yapılandırmanın nereden geleceğini esnek kılar:viper.Setile manuel atanan değerler.- Komut satırı argümanları (flags).
- Çevresel değişkenler (Environment Variables).
- Yapılandırma dosyası (config.yaml vb.).
- Uzak anahtar/değer depoları.
- Varsayılan (default) değerler.
2. Basit Bir Kurulum ve Dosya Okuma
Viper ile bir yapılandırma dosyasını okumak oldukça basittir. Genellikleconfig.yaml gibi bir dosya kullanılır.Go
Kod:
package main
import (
"fmt"
"github.com/spf13/viper"
)
func main() {
viper.SetConfigName("config") // Dosya adı (uzantısız)
viper.SetConfigType("yaml") // Dosya uzantısı
viper.AddConfigPath(".") // Çalışma dizini
if err := viper.ReadInConfig(); err != nil {
panic(fmt.Errorf("Ayarlar okunamadı: %w", err))
}
fmt.Println("Port:", viper.Get("server.port"))
}
3. Struct'a Unmarshal Etme (Eşleme)
Viper'dan değerleri tek tek çekmek yerine, tüm yapılandırmayı bir Gostruct yapısına aktarmak tip güvenliği (type safety) açısından en profesyonel yaklaşımdır.Go
Kod:
type Config struct {
Server struct {
Port int `mapstructure:"port"`
Host string `mapstructure:"host"`
} `mapstructure:"server"`
Database string `mapstructure:"database"`
}
var cfg Config
err := viper.Unmarshal(&cfg)
if err != nil {
fmt.Printf("Unmarshal hatası: %v", err)
}
4. Çevresel Değişkenler (Environment Variables)
Modern bulut uygulamalarında (Docker/Kubernetes), hassas verileri (şifreler, API anahtarları) çevresel değişkenler üzerinden iletmek bir standarttır. Viper, dosyadaki değerleri çevresel değişkenlerle otomatik olarak ezebilir.Go
Kod:
viper.AutomaticEnv() // Çevresel değişkenleri aktif et
viper.SetEnvPrefix("APP") // Örn: APP_SERVER_PORT şeklinde arar
5. Dinamik İzleme: WatchConfig
Viper, uygulama çalışırken yapılandırma dosyası değiştiğinde bunu fark edebilir. Bu sayede uygulamayı yeniden başlatmadan ayarları güncelleyebilirsiniz.Go
Kod:
viper.OnConfigChange(func(e fsnotify.Event) {
fmt.Println("Yapılandırma değişti:", e.Name)
viper.Unmarshal(&cfg) // Yeni değerleri struct'a aktar
})
viper.WatchConfig()
Özet Avantajlar Tablosu
| Özellik | Açıklama |
| Çoklu Format | YAML, JSON, TOML gibi popüler formatların hepsini destekler. |
| Varsayılan Değerler | Dosyada bulunmayan ayarlar için güvenli varsayılanlar atar. |
| Alias Desteği | Bir ayara farklı isimlerle erişmenizi sağlar. |
| Pflag Entegrasyonu | CLI argümanlarını doğrudan yapılandırmaya bağlar. |