github.com/timakin/configor

Golang Configuration tool that support YAML, JSON, Shell Environment


Install
go get github.com/timakin/configor

Documentation

Configor

Golang Configuration tool that support YAML, JSON, Shell Environment

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

Advanced Usage

  • Load mutiple configurations
// Earlier configurations have higher priority
configor.Load(&Config, "application.yml", "database.json")
  • Different configuration for each environment

Use CONFIGOR_ENV to set the environment.

If CONFIGOR_ENV not set, when running tests with go test, the ENV will be test, otherwise, it will be development

// config.go
configor.Load(&Config, "config.json")

$ go run config.go
// Will load `config.json`, `config.development.json` if it is exist
// And `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 is exist
// And `config.production.json` will overwrite `config.json`'s configuration

$ go test
// Will load `config.json`, `config.test.json` if it is exist
// And `config.test.json` will overwrite `config.json`'s configuration

$ CONFIGOR_ENV=production go test
// Will load `config.json`, `config.production.json` if it is exist
// And `config.production.json` will overwrite `config.json`'s configuration
  • 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
  • Read From Shell Environment
$ CONFIGOR_APPNAME="hello world" CONFIGOR_DB_NAME="hello world" go run config.go
// Will use shell environment's value if found with upcase of prefix (by default is CONFIGOR) + field name as key
// 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
  • 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
}

Author

jinzhu

License

Released under the MIT License