GitHub - cristalhq/aconfig: Simple, useful and opinionated config loader. (original) (raw)
aconfig
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
- Simple API.
- Clean and tested code.
- Automatic fields mapping.
- Supports different sources:
- defaults in the code
- files (JSON, YAML, TOML, DotENV, HCL)
- environment variables
- command-line flags
- Dependency-free (file parsers are optional).
- Ability to walk over configuration fields.
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.