Documentation
¶
Overview ¶
Package enviper is a helper/wrapper for http://github.com/spf13/viper with the same API. It makes it possible to unmarshal config to struct considering environment variables.
Problem ¶
Viper package (https://github.com/spf13/viper) doesn't consider environment variables while unmarshaling. Please, see: https://github.com/spf13/viper/issues/188 and https://github.com/spf13/viper/issues/761
Solution ¶
Just wrap viper instance and use the same `Unmarshal` method as you did before:
e := enviper.New(viper.New()) e.Unmarshal(&config)
Credits ¶
Thanks to https://github.com/krak3n (https://github.com/spf13/viper/issues/188#issuecomment-399884438) and https://github.com/celian-garcia (https://github.com/spf13/viper/issues/761#issuecomment-626122696) for inspiring.
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Enviper ¶
Enviper is a wrapper struct for viper, that makes it possible to unmarshal config to struct considering environment variables
func (*Enviper) TagName ¶ added in v1.4.0
TagName returns currently used tag name (`mapstructure` by default)
func (*Enviper) Unmarshal ¶
func (e *Enviper) Unmarshal(rawVal interface{}, opts ...viper.DecoderConfigOption) error
Unmarshal unmarshals the config into a Struct just like viper does. The difference between enviper and viper is in automatic overriding data from file by data from env variables
Example ¶
package main
import (
"fmt"
"io/ioutil"
"os"
"path"
"github.com/iamolegga/enviper"
"github.com/spf13/viper"
)
func main() {
// describe config structure
type barry struct {
Bar int `mapstructure:"bar"`
}
type bazzy struct {
Baz bool
}
type config struct {
Foo string
Barry barry
Bazzy bazzy `mapstructure:",squash"`
}
// write config file
dir := os.TempDir()
defer os.RemoveAll(dir)
p := path.Join(dir, "config.yaml")
ioutil.WriteFile(p, []byte(`
Foo: foo
Barry:
bar: 1
`), 0777)
// write env vars that could override values from config file
os.Setenv("MYAPP_BARRY_BAR", "2") // override value from file
os.Setenv("MYAPP_BAZ", "false")
defer os.Unsetenv("MYAPP_BARRY_BAR")
defer os.Unsetenv("MYAPP_BAZ")
// setup viper and enviper
var c config
e := enviper.New(viper.New())
e.SetEnvPrefix("MYAPP")
e.AddConfigPath(dir)
e.SetConfigName("config")
if err := e.Unmarshal(&c); err != nil {
fmt.Printf("%+v\n", err)
}
fmt.Println(c.Foo) // file only
fmt.Println(c.Barry.Bar) // file & env, take env
fmt.Println(c.Bazzy.Baz) // env only
}
Output: foo 2 false
func (*Enviper) WithTagName ¶ added in v1.4.0
WithTagName sets custom tag name to be used instead of default `mapstructure`