Viper: Yapılandırma (Config) Dosyalarını Profesyonelce Yönetin

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.

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:
  1. viper.Set ile manuel atanan değerler.
  2. Komut satırı argümanları (flags).
  3. Çevresel değişkenler (Environment Variables).
  4. Yapılandırma dosyası (config.yaml vb.).
  5. Uzak anahtar/değer depoları.
  6. Varsayılan (default) değerler.

2. Basit Bir Kurulum ve Dosya Okuma​

Viper ile bir yapılandırma dosyasını okumak oldukça basittir. Genellikle config.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 Go struct 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​

ÖzellikAçıklama
Çoklu FormatYAML, JSON, TOML gibi popüler formatların hepsini destekler.
Varsayılan DeğerlerDosyada bulunmayan ayarlar için güvenli varsayılanlar atar.
Alias DesteğiBir ayara farklı isimlerle erişmenizi sağlar.
Pflag EntegrasyonuCLI argümanlarını doğrudan yapılandırmaya bağlar.
 
Geri
Üst