Golang Configor 配置文件工具

栏目: Go · 发布时间: 5年前

内容简介:创建一个 yaml 配置文件,config.yml编写代码:Usage:

介绍

一个支持 yaml、json、toml、 shell  的配置文件工具

安装

go get github.com/jinzhu/configor
or
gopm get -v github.com/jinzhu/configor

使用示例

创建一个 yaml 配置文件,config.yml

appname: test
db:
  name:     test
  user:     root
  password: 123
  port:     3306

contacts:
  - name:  jack
    email: jack@test.com
  - name:  tom
    email: tom@test.com

编写代码:

package main

import (
    "fmt"
    "github.com/jinzhu/configor"
)

type 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()  {
    var conf = Config{}
    err := configor.Load(&conf, "config.yml")
    if err != nil {
        panic(err)
    }
    fmt.Printf("%v \n", conf)
}

测试模式

Usage:

// 上面的代码 下面这这句
err := configor.Load(&conf, "config.yml")
// 修改为
err := configor.New(&configor.Config{Debug: true}).Load(&conf, "config.yml")
# 使用环境变量开启测试模式,无需修改代码
CONFIGOR_DEBUG_MODE=true go run config.go

Output:

Current environment: 'development'
Loading configurations from file 'config.yml'...
Configuration:
  &main.Config{APPName:"test", DB:struct { Name string; User string "default:\"root\""; Password string "required:\"true\" env:\"DBPassword\""; Port uint "default:\"3306\"" }{Name:"test", User:"root", Password:"123", Port:0xcea}, Contacts:[]struct { Name string; Email string "required:\"true\"" }{struct { Name string; Email string "required:\"true\"" }{Name:"jack", Email:"jack@test.com"}, struct { Name string; Email string "required:\"true\"" }{Name:"tom", Email:"tom@test.com"}}}
{test {test root 123 3306} [{jack jack@test.com} {tom tom@test.com}]}

详细模式

Usage:

// 上面的代码 下面这这句
err := configor.Load(&conf, "config.yml")
// 修改为
err := configor.New(&configor.Config{Verbose: true}).Load(&conf, "config.yml")
# 使用环境变量开启详细模式,无需修改代码
CONFIGOR_VERBOSE_MODE=true go run config.go

Output:

Current environment: 'development'
Loading configurations from file 'config.yml'...
Trying to load struct `Config`'s field `APPName` from env Configor_APPName, CONFIGOR_APPNAME
Trying to load struct `Config`'s field `DB` from env Configor_DB, CONFIGOR_DB
Trying to load struct ``'s field `Name` from env Configor_DB_Name, CONFIGOR_DB_NAME
Trying to load struct ``'s field `User` from env Configor_DB_User, CONFIGOR_DB_USER
Trying to load struct ``'s field `Password` from env DBPassword
Trying to load struct ``'s field `Port` from env Configor_DB_Port, CONFIGOR_DB_PORT
Trying to load struct `Config`'s field `Contacts` from env Configor_Contacts, CONFIGOR_CONTACTS
Trying to load struct ``'s field `Name` from env Configor_Contacts_0_Name, CONFIGOR_CONTACTS_0_NAME
Trying to load struct ``'s field `Email` from env Configor_Contacts_0_Email, CONFIGOR_CONTACTS_0_EMAIL
Trying to load struct ``'s field `Name` from env Configor_Contacts_1_Name, CONFIGOR_CONTACTS_1_NAME
Trying to load struct ``'s field `Email` from env Configor_Contacts_1_Email, CONFIGOR_CONTACTS_1_EMAIL
Configuration:
  &main.Config{APPName:"test", DB:struct { Name string; User string "default:\"root\""; Password string "required:\"true\" env:\"DBPassword\""; Port uint "default:\"3306\"" }{Name:"test", User:"root", Password:"123", Port:0xcea}, Contacts:[]struct { Name string; Email string "required:\"true\"" }{struct { Name string; Email string "required:\"true\"" }{Name:"jack", Email:"jack@test.com"}, struct { Name string; Email string "required:\"true\"" }{Name:"tom", Email:"tom@test.com"}}}
{test {test root 123 3306} [{jack jack@test.com} {tom tom@test.com}]}

高级用法

加载多个配置文件

// application.yml 的优先级 大于 database.json, 排在前面的配置文件优先级大于排在后的的配置
configor.Load(&Config, "application.yml", "database.json")

根据环境变量加载配置文件

使用 CONFIGOR_ENV 设置环境变量,如果 CONFIGOR_ENV 没有设置,框架将会使用 development 作为默认环境变量。

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

$ go run config.go
// 将会加载 `config.json`,如果存在 `config.development.json` 将会自动加载
// `config.development.json` 将会覆盖 `config.json` 的配置


$ CONFIGOR_ENV=production go run config.go
// 将会加载 `config.json`,如果存在 `config.production.json` 将会自动加载
// `config.production.json` 将会覆盖 `config.json` 的配置

$ go test
// 将会加载 `config.json`,如果存在 `config.test.json` 将会自动加载
// `config.test.json` 将会覆盖 `config.json` 的配置

$ CONFIGOR_ENV=production go test
// 将会加载 `config.json`,如果存在 `config.production.json` 将会自动加载
// `config.production.json` 将会覆盖 `config.json` 的配置
// 在代码里面设置 环境变量
configor.New(&configor.Config{Environment: "production"}).Load(&Config, "config.json")

示例配置

configor.Load(&Config, "config.yml")

$ go run config.go

# 将会自动加载 `config.example.yml` 如果 `config.yml` 不存在将会输出警告信息

Output:

Failed to find configuration config.yml, using example file config.example.yml
{test {dodododo root 123 3306 } [{jack jack@test.com} {tom tom@test.com}]}

从shell加载配置项

CONFIGOR_APPNAME="hello world" go run config.go
# 格式为 {{prefix}}_FieldName
# 覆盖 prefix shell 操作
$ CONFIGOR_ENV_PREFIX="WEB" WEB_APPNAME="hello, prefix" go run config.go

# 在代码的书写方式为
configor.New(&configor.Config{ENVPrefix: "WEB"}).Load(&Config, "config.json")

匿名结构 - Anonymous Struct

type Details Struct {
    Description string
}

type Config struct {
    Details `anonymous:"true"`
}

如果使用 anonymous:"true" 标签,那么 Description 参数的环境变量将会变为 CONFIGOR_DESCRIPTION ,否则环境变量将会是 CONFIGOR_DETAILS_DESCRIPTION


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

JavaScript and Ajax for the Web, Sixth Edition

JavaScript and Ajax for the Web, Sixth Edition

Tom Negrino、Dori Smith / Peachpit Press / August 28, 2006 / $24.99

Book Description Need to learn JavaScript fast? This best-selling reference’s visual format and step-by-step, task-based instructions will have you up and running with JavaScript in no time. In thi......一起来看看 《JavaScript and Ajax for the Web, Sixth Edition》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试