config

package module
v0.2.6 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 31, 2024 License: MIT Imports: 13 Imported by: 2

README

Config

Golang Configuration tool that support YAML, JSON, Shell Environment

is same as configor , but add LoadWithKey support and remove toml

Usage

config.example.yaml in ./config directory

server:
  host: 10.10.0.178
  port: 8585

redis:
  host: 10.1.0.16
  port: 6379
  db: 5
package main

import (
	"encoding/json"
	"fmt"
	"github.com/linxlib/config"
	"os"
)

type ServerConfig struct {
	Host string `yaml:"host" default:"0.0.0.0" env:"CONFIG_HOST"`
	Port string `yaml:"port" default:"8080"`
}

type RedisConfig struct {
	Host string `yaml:"host" default:"0.0.0.0"`
	Port string `yaml:"port" default:"8080"`
	DB   int    `yaml:"db" default:"0"`
}

func main() {
	//os.Setenv("CONFIG_HOST", "1.1.1.1")
	os.Setenv("CONFIG_REDIS_HOST", "1.2.1.1")
	var sc = new(ServerConfig)
	var rc = new(RedisConfig)
	err := config.LoadWithKey("server", sc, "config/config.yaml")
	if err != nil {
		return
	}
	err = config.LoadWithKey("redis", rc, "config/config.yaml")
	if err != nil {
		return
	}
	var sc1 = new(ServerConfig)
	err = config.LoadWithKey("", sc1, "config/config.yaml")
	if err != nil {
		return
	}
	bs, _ := json.MarshalIndent(sc, "", "  ")
	fmt.Println(string(bs))
	bs, _ = json.MarshalIndent(rc, "", "  ")
	fmt.Println(string(bs))
	bs, _ = json.MarshalIndent(sc1, "", "  ")
	fmt.Println(string(bs))

}

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/Verbose mode is helpful when debuging your application, debug mode will let you know how config loaded your configurations, like from which file, shell env, verbose mode will tell you even more, like those shell environments config tried to load.

// Enable debug mode or set env `CONFIG_DEBUG_MODE` to true when running your application
config.New(&config.Config{Debug: true}).Load(&Config, "config.json")

// Enable verbose mode or set env `CONFIG_VERBOSE_MODE` to true when running your application
config.New(&config.Config{Verbose: true}).Load(&Config, "config.json")

Auto Reload Mode

Config can auto reload configuration based on time

// auto reload configuration every second
config.New(&config.Config{AutoReload: true}).Load(&Config, "config.json")

// auto reload configuration every minute
config.New(&config.Config{AutoReload: true, AutoReloadInterval: time.Minute}).Load(&Config, "config.json")

Auto Reload Callback

config.New(&config.Config{AutoReload: true, AutoReloadCallback: func(config interface{}) {
    fmt.Printf("%v changed", config)
}}).Load(&Config, "config.json")

Advanced Usage

  • Load multiple configurations
// Earlier configurations have higher priority
config.Load(&Config, "application.yml", "database.json")
  • Load configuration by environment

Use CONFIG_ENV to set environment, if CONFIG_ENV not set, environment will be development by default, and it will be test when running tests with go test

// config.go
config.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

$ CONFIG_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

$ CONFIG_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
config.New(&config.Config{Environment: "production"}).Load(&Config, "config.json")
  • Example Configuration
// config.go
config.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
$ CONFIG_APPNAME="hello world" CONFIG_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 CONFIG_ENV_PREFIX, for example:
$ CONFIG_ENV_PREFIX="WEB" WEB_APPNAME="hello world" WEB_DB_NAME="hello world" go run config.go

// Set prefix by config
config.New(&config.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 CONFIG_DESCRIPTION. Without the anonymous:"true"tag specified, then environment variable would include the embedded struct name and be CONFIG_DETAILS_DESCRIPTION.

  • With flags
func main() {
	conf := 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("CONFIG_ENV_PREFIX", "-")
	config.Load(&Config, *conf)
	// config.Load(&Config) // only load configurations from shell env & flag
}

License

Released under the MIT License

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func ENV added in v0.2.1

func ENV() string

ENV return environment

func Load added in v0.2.1

func Load(config interface{}, files ...string) error

Load will unmarshal configurations to struct from files that you provide

func LoadWithKey added in v0.2.1

func LoadWithKey(key string, config interface{}, files ...string) error

Types

type Config added in v0.2.0

type Config struct {
	*Option
	// contains filtered or unexported fields
}

func New added in v0.2.0

func New(config *Option) *Config

New initialize a Config

func (*Config) GetEnvironment added in v0.2.1

func (c *Config) GetEnvironment() string

GetEnvironment get environment

func (*Config) Load added in v0.2.1

func (c *Config) Load(config interface{}) error

Load will unmarshal configurations to struct from files that you provide

func (*Config) LoadWithKey added in v0.2.1

func (c *Config) LoadWithKey(key string, config interface{}) (err error)

type Option added in v0.2.1

type Option struct {
	Environment        string
	ENVPrefix          string
	Debug              bool
	Verbose            bool
	Silent             bool
	AutoReload         bool
	AutoReloadInterval time.Duration
	AutoReloadCallback func(key string, config interface{})
	Files              []string
	// You can use embed.FS or any other fs.FS to load configs from. Default - use "os" package
	FS fs.FS
}

type RawNode added in v0.2.1

type RawNode struct {
	*yaml.Node
}

func (*RawNode) UnmarshalYAML added in v0.2.1

func (n *RawNode) UnmarshalYAML(node *yaml.Node) error

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL