Package enviper is a helper/wrapper for viper with the same API. It makes it possible to unmarshal config to struct considering environment variables.
Attention : this repository is a fork for specific purpose. Use it only if you absolutely need to override map values with environment variables.
Otherwise, you should use the main repository https://github.com/iamolegga/enviper
Viper package doesn't consider environment variables while unmarshaling. Please, see: 188 and 761
Just wrap viper instance and use the same Unmarshal
method as you did before:
e := enviper.New(viper.New())
e.Unmarshal(&config)
package main
import (
"github.com/iamolegga/enviper"
"github.com/spf13/viper"
)
type barry struct {
Bar int `mapstructure:"bar"`
}
type bazzy struct {
Baz bool
}
type config struct {
Foo string
Barry barry
Barries map[string]barry
Bazzy bazzy `mapstructure:",squash"`
}
// For example this kind of structure can be unmarshaled with next yaml:
// Foo: foo
// Barry:
// bar: 42
// Baz: true
// Barries:
// key1:
// Bar: 255
// key2:
// Bar: 256
//
// And then it could be overriden by next env variables:
// FOO=foo
// BARRY_BAR=42
// BAZ=true
// BARRIES_KEY1_BAR=42
//
// Or with prefix:
// MYAPP_FOO=foo
// MYAPP_BARRY_BAR=42
// MYAPP_BAZ=true
// MYAPP_BARRIES_KEY1_BAR=42
func main() {
var c config
e := enviper.New(viper.New())
e.SetEnvPrefix("MYAPP")
e.AddConfigPath("/my/config/path")
e.SetConfigName("config")
e.Unmarshal(&c)
}
Thanks to krak3n (issuecomment-399884438) and celian-garcia (issuecomment-626122696) for inspiring.
Thanks to iamolegga for taking the time to create this enviper library.