cristalhq / aconfig

Simple, useful and opinionated config loader.
MIT License
546 stars 32 forks source link
command-line config configuration configuration-files dependency-free environment environment-variables go golang json toml yaml

aconfig

build-img pkg-img version-img

Simple, useful and opinionated config loader.

Rationale

There are many solutions regarding configuration loading in Go. I was looking for a simple loader that is as easy to use and understand as possible. The goal was to load config from 4 places: defaults (in the code), files, environment variables, command-line flags. This library works with all of these sources.

Features

Install

Go version 1.14+

go get github.com/cristalhq/aconfig

Example

type MyConfig struct {
    Port int `default:"1111" usage:"just give a number"`
    Auth struct {
        User string `required:"true"`
        Pass string `required:"true"`
    }
    Pass string `default:"" env:"SECRET" flag:"sec_ret"`
}

var cfg MyConfig
loader := aconfig.LoaderFor(&cfg, aconfig.Config{
    // feel free to skip some steps :)
    // SkipDefaults: true,
    // SkipFiles:    true,
    // SkipEnv:      true,
    // SkipFlags:    true,
    EnvPrefix:       "APP",
    FlagPrefix:      "app",
    Files:           []string{"/var/opt/myapp/config.json", "ouch.yaml"},
    FileDecoders: map[string]aconfig.FileDecoder{
        // from `aconfigyaml` submodule
        // see submodules in repo for more formats
        ".yaml": aconfigyaml.New(),
    },
})

// IMPORTANT: define your own flags with `flagSet`
flagSet := loader.Flags()

if err := loader.Load(); err != nil {
    panic(err)
}

// configuration fields will be loaded from (in order):
//
// 1. defaults set in structure tags (see MyConfig defenition)
// 2. loaded from files `file.json` if not `ouch.yaml` will be used
// 3. from corresponding environment variables with the prefix `APP_`
// 4. command-line flags with the prefix `app.` if they are

Also see examples: examples_test.go.

Integration with spf13/cobra playground.

Documentation

See these docs.

License

MIT License.