Golang Configuration tool that support YAML, JSON, TOML, Shell Environment (Supports Go 1.10+)
Usage
package main import ( "fmt" "github.com/jinzhu/configor" ) var Config = struct { APPName string `default:"app name"` DB struct { Name string User string `default:"root"` Password string `required:"true" env:"DBPassword"` Port uint `default:"3306"` } Contacts []struct { Name string Email string `required:"true"` } }{} func main() { configor.Load(&Config, "config.yml") fmt.Printf("config: %#v", Config) }
With configuration file config.yml:
appname: test db: name: test user: test password: test port: 1234 contacts: - name: i test email: test@test.com
Debug Mode & Verbose Mode
debug modeconfigorverbose modeconfigor
// Enable debug mode or set env `CONFIGOR_DEBUG_MODE` to true when running your application configor.New(&configor.Config{Debug: true}).Load(&Config, "config.json") // Enable verbose mode or set env `CONFIGOR_VERBOSE_MODE` to true when running your application configor.New(&configor.Config{Verbose: true}).Load(&Config, "config.json")
Auto Reload Mode
Configor can auto reload configuration based on time
// auto reload configuration every second configor.New(&configor.Config{AutoReload: true}).Load(&Config, "config.json") // auto reload configuration every minute configor.New(&configor.Config{AutoReload: true, AutoReloadInterval: time.Minute}).Load(&Config, "config.json")
Auto Reload Callback
configor.New(&configor.Config{AutoReload: true, AutoReloadCallback: func(config interface{}) { fmt.Printf("%v changed", config) }}).Load(&Config, "config.json")Advanced Usage
- Load mutiple configurations
// Earlier configurations have higher priority configor.Load(&Config, "application.yml", "database.json")
- Return error on unmatched keys
Return an error on finding keys in the config file that do not match any fields in the config struct. In the example below, an error will be returned if config.toml contains keys that do not match any fields in the ConfigStruct struct. If ErrorOnUnmatchedKeys is not set, it defaults to false.
Note that for json files, setting ErrorOnUnmatchedKeys to true will have an effect only if using go 1.10 or later.
err := configor.New(&configor.Config{ErrorOnUnmatchedKeys: true}).Load(&ConfigStruct, "config.toml")
- Load configuration by environment
CONFIGOR_ENVCONFIGOR_ENVdevelopmenttestgo test
// config.go configor.Load(&Config, "config.json") $ go run config.go // Will load `config.json`, `config.development.json` if it exists // `config.development.json` will overwrite `config.json`'s configuration // You could use this to share same configuration across different environments $ CONFIGOR_ENV=production go run config.go // Will load `config.json`, `config.production.json` if it exists // `config.production.json` will overwrite `config.json`'s configuration $ go test // Will load `config.json`, `config.test.json` if it exists // `config.test.json` will overwrite `config.json`'s configuration $ CONFIGOR_ENV=production go test // Will load `config.json`, `config.production.json` if it exists // `config.production.json` will overwrite `config.json`'s configuration
// Set environment by config configor.New(&configor.Config{Environment: "production"}).Load(&Config, "config.json")
- Example Configuration
// config.go configor.Load(&Config, "config.yml") $ go run config.go // Will load `config.example.yml` automatically if `config.yml` not found and print warning message
- Load From Shell Environment
$ CONFIGOR_APPNAME="hello world" CONFIGOR_DB_NAME="hello world" go run config.go // Load configuration from shell environment, it's name is {{prefix}}_FieldName
// You could overwrite the prefix with environment CONFIGOR_ENV_PREFIX, for example: $ CONFIGOR_ENV_PREFIX="WEB" WEB_APPNAME="hello world" WEB_DB_NAME="hello world" go run config.go // Set prefix by config configor.New(&configor.Config{ENVPrefix: "WEB"}).Load(&Config, "config.json")
- Anonymous Struct
anonymous:"true"
type Details struct { Description string } type Config struct { Details `anonymous:"true"` }
anonymous:"true"DescriptionCONFIGOR_DESCRIPTIONanonymous:"true"CONFIGOR_DETAILS_DESCRIPTION
- With flags
func main() { config := flag.String("file", "config.yml", "configuration file") flag.StringVar(&Config.APPName, "name", "", "app name") flag.StringVar(&Config.DB.Name, "db-name", "", "database name") flag.StringVar(&Config.DB.User, "db-user", "root", "database user") flag.Parse() os.Setenv("CONFIGOR_ENV_PREFIX", "-") configor.Load(&Config, *config) // configor.Load(&Config) // only load configurations from shell env & flag }
Contributing
You can help to make the project better, check out http://gorm.io/contribute.html for things you can do.
Author
jinzhu
License
Released under the MIT License