golang简单实用的配置加载器插件库aconfig的使用
Golang简单实用的配置加载器插件库aconfig的使用
简介
aconfig是一个简单、实用且固执己见的配置加载器库。它可以从多个来源加载配置:代码中的默认值、配置文件、环境变量和命令行标志。
特性
- 简单的API
- 干净且经过测试的代码
- 自动字段映射
- 支持多种来源:
- 代码中的默认值
- 文件(JSON, YAML, TOML, DotENV, HCL)
- 环境变量
- 命令行标志
- 无依赖(文件解析器是可选的)
- 能够遍历配置字段
安装
Go版本1.14+
go get github.com/cristalhq/aconfig
完整示例
package main
import (
"github.com/cristalhq/aconfig"
"github.com/cristalhq/aconfig/aconfigyaml"
)
// 定义配置结构体
type MyConfig struct {
Port int `default:"1111" usage:"just give a number"`
Auth struct {
User string `required:"true"`
Pass string `required:"true"`
}
Pass string `default:"" env:"SECRET" flag:"sec_ret"`
}
func main() {
var cfg MyConfig
// 创建配置加载器
loader := aconfig.LoaderFor(&cfg, aconfig.Config{
// 可以跳过某些步骤
// SkipDefaults: true,
// SkipFiles: true,
// SkipEnv: true,
// SkipFlags: true,
EnvPrefix: "APP", // 环境变量前缀
FlagPrefix: "app", // 命令行标志前缀
Files: []string{"/var/opt/myapp/config.json", "ouch.yaml"}, // 配置文件路径
FileDecoders: map[string]aconfig.FileDecoder{
// 使用yaml解析器
".yaml": aconfigyaml.New(),
},
})
// 获取flagSet用于自定义命令行标志
flagSet := loader.Flags()
// 加载配置
if err := loader.Load(); err != nil {
panic(err)
}
// 配置字段将按以下顺序加载:
// 1. 结构体标签中设置的默认值(见MyConfig定义)
// 2. 从文件加载(先尝试/var/opt/myapp/config.json,然后是ouch.yaml)
// 3. 从带有APP_前缀的环境变量加载
// 4. 从带有app.前缀的命令行标志加载(如果有的话)
}
配置加载顺序
aconfig会按照以下顺序加载配置:
- 结构体标签中设置的默认值
- 从指定的配置文件加载
- 从带有指定前缀的环境变量加载
- 从带有指定前缀的命令行标志加载
注意事项
- 如果需要自定义命令行标志,可以使用
loader.Flags()
获取flag.FlagSet
- 对于YAML、JSON等文件格式的支持需要导入相应的子模块
- 可以通过设置
SkipDefaults
、SkipFiles
等选项跳过某些加载步骤
这个库非常适合需要从多种来源加载配置的Go应用程序,它提供了简单直观的API和灵活的配置选项。
更多关于golang简单实用的配置加载器插件库aconfig的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang简单实用的配置加载器插件库aconfig的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
aconfig - Golang 配置加载器插件库使用指南
aconfig 是一个简单实用的 Golang 配置加载器库,支持从多种来源加载配置,包括环境变量、命令行参数、JSON/YAML 文件等。下面我将详细介绍其使用方法。
安装
go get github.com/cristalhq/aconfig
基本用法
1. 定义配置结构
首先定义一个结构体来表示你的配置:
type Config struct {
Port int `default:"8080" env:"PORT" flag:"port" usage:"port to listen on"`
LogLevel string `default:"info" env:"LOG_LEVEL" flag:"log-level" usage:"log level"`
DBURL string `required:"true" env:"DB_URL" flag:"db-url" usage:"database connection string"`
}
标签说明:
default
: 默认值env
: 环境变量名flag
: 命令行参数名usage
: 帮助信息required
: 是否为必填项
2. 加载配置
package main
import (
"fmt"
"github.com/cristalhq/aconfig"
)
func main() {
var cfg Config
// 创建加载器
loader := aconfig.LoaderFor(&cfg, aconfig.Config{
SkipFlags: false, // 是否跳过命令行参数解析
SkipEnv: false, // 是否跳过环境变量解析
Files: []string{"./config.json", "./config.yaml"}, // 配置文件路径
FileDecoders: map[string]aconfig.FileDecoder{
".json": aconfig.JSONDecoder,
".yaml": aconfig.YAMLDecoder,
},
})
// 加载配置
if err := loader.Load(); err != nil {
panic(err)
}
fmt.Printf("Config: %+v\n", cfg)
}
高级用法
1. 自定义文件加载器
loader := aconfig.LoaderFor(&cfg, aconfig.Config{
Files: []string{"./config.toml"},
FileDecoders: map[string]aconfig.FileDecoder{
".toml": func(bytes []byte) (map[string]interface{}, error) {
var data map[string]interface{}
if err := toml.Unmarshal(bytes, &data); err != nil {
return nil, err
}
return data, nil
},
},
})
2. 自定义环境变量前缀
loader := aconfig.LoaderFor(&cfg, aconfig.Config{
EnvPrefix: "MYAPP_", // 环境变量前缀
})
这样会查找 MYAPP_PORT
而不是 PORT
3. 从多个来源合并配置
aconfig 会按照以下顺序加载配置,后面的会覆盖前面的:
- 结构体中的默认值
- 配置文件中的值
- 环境变量
- 命令行参数
4. 验证配置
if err := loader.Load(); err != nil {
if errors.Is(err, aconfig.ErrRequiredNotSet) {
fmt.Println("Missing required configuration")
}
panic(err)
}
完整示例
package main
import (
"fmt"
"github.com/cristalhq/aconfig"
)
type Config struct {
Host string `default:"localhost" env:"HOST" flag:"host" usage:"server host"`
Port int `default:"8080" env:"PORT" flag:"port" usage:"server port"`
Debug bool `default:"false" env:"DEBUG" flag:"debug" usage:"debug mode"`
Timeout int `default:"30" env:"TIMEOUT" flag:"timeout" usage:"request timeout in seconds"`
}
func main() {
var cfg Config
loader := aconfig.LoaderFor(&cfg, aconfig.Config{
Files: []string{"./config.yaml", "./config.json"},
FileDecoders: map[string]aconfig.FileDecoder{
".yaml": aconfig.YAMLDecoder,
".json": aconfig.JSONDecoder,
},
})
if err := loader.Load(); err != nil {
panic(err)
}
fmt.Printf("Server running on %s:%d\n", cfg.Host, cfg.Port)
fmt.Printf("Debug mode: %v\n", cfg.Debug)
fmt.Printf("Timeout: %d seconds\n", cfg.Timeout)
}
配置文件示例
config.yaml
:
host: "0.0.0.0"
port: 9000
debug: true
或者 config.json
:
{
"host": "0.0.0.0",
"port": 9000,
"debug": true
}
命令行使用
编译程序后可以这样运行:
./myapp --port 9090 --debug=true
或者查看帮助:
./myapp --help
aconfig 是一个轻量级但功能强大的配置加载库,特别适合需要从多种来源加载配置的应用程序。它的设计简洁,易于集成到现有项目中。