713ab02450
* Added configor as a new library
Now config is a singleton. You only need to do config.Get() instead of doing config.Conf.
* Forgot godep save 🐤
* Fix accidental removal of }
4 Kio
4 Kio
Configor
Golang Configuration tool that support YAML, JSON, TOML, 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")
- 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
// 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
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:
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
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
Author
jinzhu
License
Released under the MIT License