Golang Configor 配置文件工具

Arrows · · 2942 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

介绍

一个支持 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


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:Arrows

查看原文:Golang Configor 配置文件工具

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2942 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传