Damit man ein weiteres File einlesen kann, muss man mit viper.New()
eine neue Viper-Instanz erstellen. Dann kann man das zweite File auf diese Instanz einlesen und dann auf die Haupt-Instanz mergen. Beachte aber, dass die Maps sich auch gegenseitig überschreiben können. Stelle deshalb technisch fest, dass das nicht passiert.
v := viper.New()
v.SetConfigType("env")
v.SetConfigFile(".env")
v.AddConfigPath(".")
err = v.ReadInConfig()
if err != nil {
log.Fatalf("failed to read viper .env config: %s", err.Error())
}
err = viper.MergeConfigMap(v.AllSettings())
if err != nil {
log.Fatalf("failed to merge viper .env config: %s", err.Error())
}
// Check your values
fmt.Println(fmt.Sprintf("%v", viper.AllKeys()))
fmt.Println(fmt.Sprintf("%v", viper.AllSettings()))
Add the config-files to your project
main.go
var err error
viper.SetConfigName("config")
viper.SetConfigType("yaml")
viper.AddConfigPath(".")
err = viper.ReadInConfig()
if err != nil {
log.Fatalf("failed to read viper yaml config: %s", err.Error())
}
err = viper.MergeInConfig()
if err != nil {
log.Fatalf("failed to merge viper yaml config: %s", err.Error())
}
fmt.Println("---------- first print of config file ----------")
fmt.Printf("server.scheme: %s\\n", viper.GetString("server.scheme"))
fmt.Printf("server.domain: %s\\n", viper.GetString("server.domain"))
fmt.Printf("server.port: %d\\n", viper.GetInt("server.port"))
v := viper.New()
v.SetConfigType("env")
v.SetConfigFile(".env")
v.AddConfigPath(".")
err = v.ReadInConfig()
if err != nil {
log.Fatalf("failed to read viper .env config: %s", err.Error())
}
err = viper.MergeConfigMap(v.AllSettings())
if err != nil {
log.Fatalf("failed to merge viper .env config: %s", err.Error())
}
fmt.Println("---------- second print of config file (after .env-load) ----------")
fmt.Printf("server.scheme: %s\\n", viper.GetString("server.scheme"))
fmt.Printf("server.domain: %s\\n", viper.GetString("server.domain"))
fmt.Printf("server.port: %d\\n", viper.GetInt("server.port"))
fmt.Println("---------- print of .env file ----------")
fmt.Printf("GOOGLE_OAUTH_CLIENT_ID: %s\\n", viper.GetString("GOOGLE_OAUTH_CLIENT_ID"))
fmt.Printf("GOOGLE_OAUTH_CLIENT_SECRET: %s\\n", viper.GetString("GOOGLE_OAUTH_CLIENT_SECRET"))
fmt.Println("---------- print whole viper construct ----------")
fmt.Println(fmt.Sprintf("%v", *viper.GetViper()))
config.yaml
server:
scheme: http
domain: localhost
port: 8080
.env
GOOGLE_OAUTH_CLIENT_ID=123@google
GOOGLE_OAUTH_CLIENT_SECRET=SECRET