# Configor Golang Configuration tool that support YAML, JSON, TOML, Shell Environment ## Usage ```go 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*: ```yaml appname: test db: name: test user: test password: test port: 1234 contacts: - name: i test email: test@test.com ``` # Advanced Usage * Load mutiple configurations ```go // Earlier configurations have higher priority configor.Load(&Config, "application.yml", "database.json") ``` * Load configuration by environment Use `CONFIGOR_ENV` to set environment, if `CONFIGOR_ENV` not set, environment will be `development` by default, and it will be `test` when running tests with `go test` ```go // 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 ``` ```go // Set environment by config configor.New(&configor.Config{Environment: "production"}).Load(&Config, "config.json") ``` * Example Configuration ```go // 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 ```go $ CONFIGOR_APPNAME="hello world" CONFIGOR_DB_NAME="hello world" go run config.go // Load configuration from shell environment, it's name is {{prefix}}_FieldName ``` ```go // 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 Add the `anonymous:"true"` tag to an anonymous, embedded struct to NOT include the struct name in the environment variable of any contained fields. For example: ```go type Details struct { Description string } type Config struct { Details `anonymous:"true"` } ``` With the `anonymous:"true"` tag specified, the environment variable for the `Description` field is `CONFIGOR_DESCRIPTION`. Without the `anonymous:"true"`tag specified, then environment variable would include the embedded struct name and be `CONFIGOR_DETAILS_DESCRIPTION`. * With flags ```go 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 } ``` ## Supporting the project [![http://patreon.com/jinzhu](http://patreon_public_assets.s3.amazonaws.com/sized/becomeAPatronBanner.png)](http://patreon.com/jinzhu) ## Author **jinzhu** * * * ## License Released under the MIT License