golang轻量级配置文件读取插件库cleanenv的使用
Golang轻量级配置文件读取插件库cleanenv的使用
Clean Env是一个极简的配置读取工具,主要功能包括:
- 从文件读取和解析配置结构
- 从环境变量读取并覆盖配置结构
- 生成详细的变量列表帮助输出
安装
go get -u github.com/ilyakaznacheev/cleanenv
基本使用
读取配置文件
import "github.com/ilyakaznacheev/cleanenv"
type ConfigDatabase struct {
Port string `yaml:"port" env:"PORT" env-default:"5432"`
Host string `yaml:"host" env:"HOST" env-default:"localhost"`
Name string `yaml:"name" env:"NAME" env-default:"postgres"`
User string `yaml:"user" env:"USER" env-default:"user"`
Password string `yaml:"password" env:"PASSWORD"`
}
var cfg ConfigDatabase
err := cleanenv.ReadConfig("config.yml", &cfg)
if err != nil {
// 处理错误
}
这个操作会:
- 根据YAML格式解析配置文件
- 读取环境变量并用环境变量值覆盖文件中的值
- 如果前两步都没有值,则使用默认值(如果有设置)
仅读取环境变量
type ConfigDatabase struct {
Port string `env:"PORT" env-default:"5432"`
Host string `env:"HOST" env-default:"localhost"`
Name string `env:"NAME" env-default:"postgres"`
User string `env:"USER" env-default:"user"`
Password string `env:"PASSWORD"`
}
var cfg ConfigDatabase
err := cleanenv.ReadEnv(&cfg)
if err != nil {
// 处理错误
}
更新环境变量
type ConfigRemote struct {
Port string `env:"PORT" env-upd`
Host string `env:"HOST" env-upd`
UserName string `env:"USERNAME"`
}
var cfg ConfigRemote
cleanenv.ReadEnv(&cfg)
// ... 中间执行一些操作
err := cleanenv.UpdateEnv(&cfg)
if err != nil {
// 处理错误
}
获取变量描述
type ConfigServer struct {
Port string `env:"PORT" env-description:"server port"`
Host string `env:"HOST" env-description:"server host"`
}
var cfg ConfigRemote
help, err := cleanenv.GetDescription(&cfg, nil)
if err != nil {
// 处理错误
}
输出:
Environment variables:
PORT server port
HOST server host
模型格式
支持的标签:
env="<name>"
- 环境变量名env-upd
- 标记字段为可更新env-required
- 标记字段为必填env-default="<value>"
- 默认值env-separator="<value>"
- 自定义列表和映射分隔符env-description="<value>"
- 环境变量描述env-layout="<value>"
- 解析布局(如time.Time)env-prefix="<value>"
- 嵌套结构体所有字段的前缀
支持的类型
- 各种整型
- 各种浮点型
- 字符串
- 布尔值
- 切片(任何支持的类型)
- 映射(任何支持的类型)
- time.Duration
- time.Time(默认布局RFC3339,可通过env-layout覆盖)
- *time.Location
- 实现encoding.TextUnmarshaler的任何类型
- 实现cleanenv.Setter接口的任何类型
自定义功能
自定义值设置器
type MyField string
func (f *MyField) SetValue(s string) error {
if s == "" {
return fmt.Errorf("field value can't be empty")
}
*f = MyField("my field is: "+ s)
return nil
}
type Config struct {
Field MyField `env="MY_VALUE"`
}
自定义值更新
type Config struct {
Field string
}
func (c *Config) Update() error {
newField, err := SomeCustomUpdate()
f.Field = newField
return err
}
支持的文件格式
- YAML (.yaml, .yml)
- JSON (.json)
- TOML (.toml)
- EDN (.edn)
- ENV (.env)
注意:使用.env文件时,库会将相应数据设置为进程环境变量,会覆盖进程中已有的同名变量。
示例
type Config struct {
Port string `yaml:"port" env:"PORT" env-default:"8080"`
Host string `yaml:"host" env:"HOST" env-default:"localhost"`
}
var cfg Config
err := ReadConfig("config.yml", &cfg)
if err != nil {
// 处理错误
}
这个代码会尝试读取并解析config.yml配置文件,然后会用可用的环境变量(PORT, HOST)覆盖字段值。
更多关于golang轻量级配置文件读取插件库cleanenv的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang轻量级配置文件读取插件库cleanenv的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Cleanenv:轻量级Go配置文件读取库
Cleanenv是一个轻量级的Go语言配置文件读取库,它支持多种格式的配置文件,包括JSON、YAML、TOML、ENV等,并提供了简洁的API来读取和解析配置。
主要特性
- 支持多种配置文件格式:JSON、YAML、TOML、ENV
- 支持环境变量覆盖配置
- 支持默认值设置
- 简洁易用的API
- 轻量级,无额外依赖
安装
go get github.com/ilyakaznacheev/cleanenv@latest
基本使用
1. 定义配置结构体
首先定义一个结构体来表示你的配置:
type Config struct {
Port int `yaml:"port" env:"PORT" env-default:"8080"`
LogLevel string `yaml:"log_level" env:"LOG_LEVEL" env-default:"info"`
DB struct {
Host string `yaml:"host" env:"DB_HOST" env-default:"localhost"`
Port int `yaml:"port" env:"DB_PORT" env-default:"5432"`
Name string `yaml:"name" env:"DB_NAME" env-default:"postgres"`
User string `yaml:"user" env:"DB_USER" env-default:"postgres"`
Password string `yaml:"password" env:"DB_PASSWORD" env-default:""`
} `yaml:"db"`
}
标签说明:
yaml
:指定YAML文件中的字段名env
:指定环境变量名env-default
:设置默认值
2. 读取配置文件
package main
import (
"fmt"
"log"
"github.com/ilyakaznacheev/cleanenv"
)
func main() {
var cfg Config
// 从config.yaml读取配置
err := cleanenv.ReadConfig("config.yaml", &cfg)
if err != nil {
log.Fatalf("cannot read config: %s", err)
}
fmt.Printf("Port: %d\n", cfg.Port)
fmt.Printf("Log Level: %s\n", cfg.LogLevel)
fmt.Printf("DB Host: %s\n", cfg.DB.Host)
}
3. 环境变量覆盖
Cleanenv会自动检查环境变量,如果找到匹配的环境变量,会覆盖配置文件中的值。
例如,设置环境变量:
export PORT=9090
export DB_HOST=db.example.com
然后运行程序,这些值会覆盖配置文件中的设置。
4. 仅使用环境变量
如果你只想使用环境变量而不需要配置文件:
var cfg Config
err := cleanenv.ReadEnv(&cfg)
if err != nil {
log.Fatalf("cannot read env: %s", err)
}
5. 生成配置文档
Cleanenv可以生成配置文档,方便查看所有可用的配置项:
help, err := cleanenv.GetDescription(&cfg, nil)
if err != nil {
log.Fatalf("cannot generate config help: %s", err)
}
fmt.Println(help)
高级用法
自定义配置文件路径
// 从指定路径读取配置
err := cleanenv.ReadConfig("/path/to/config.yml", &cfg)
支持多种文件格式
Cleanenv会自动根据文件扩展名识别格式:
.yaml
,.yml
- YAML.json
- JSON.toml
- TOML.env
- ENV
必填字段验证
type Config struct {
APIKey string `yaml:"api_key" env:"API_KEY" env-required:"true"`
}
如果设置了env-required:"true"
且该字段为空,会返回错误。
完整示例
package main
import (
"fmt"
"log"
"os"
"github.com/ilyakaznacheev/cleanenv"
)
type Config struct {
AppName string `yaml:"app_name" env:"APP_NAME" env-default:"MyApp"`
Port int `yaml:"port" env:"PORT" env-default:"8080"`
Debug bool `yaml:"debug" env:"DEBUG" env-default:"false"`
Database struct {
Host string `yaml:"host" env:"DB_HOST" env-default:"localhost"`
Port int `yaml:"port" env:"DB_PORT" env-default:"5432"`
Username string `yaml:"username" env:"DB_USER" env-default:"user"`
Password string `yaml:"password" env:"DB_PASSWORD" env-required:"true"`
} `yaml:"database"`
}
func main() {
var cfg Config
// 尝试从config.yaml读取配置
err := cleanenv.ReadConfig("config.yaml", &cfg)
if err != nil {
// 如果文件不存在,尝试仅从环境变量读取
if os.IsNotExist(err) {
log.Println("config file not found, using environment variables only")
err = cleanenv.ReadEnv(&cfg)
if err != nil {
log.Fatalf("cannot read env: %s", err)
}
} else {
log.Fatalf("cannot read config: %s", err)
}
}
// 打印配置
fmt.Printf("App Name: %s\n", cfg.AppName)
fmt.Printf("Port: %d\n", cfg.Port)
fmt.Printf("Debug Mode: %t\n", cfg.Debug)
fmt.Printf("Database Host: %s\n", cfg.Database.Host)
fmt.Printf("Database Port: %d\n", cfg.Database.Port)
fmt.Printf("Database Username: %s\n", cfg.Database.Username)
// 生成并打印配置帮助
help, err := cleanenv.GetDescription(&cfg, nil)
if err != nil {
log.Printf("cannot generate config help: %s", err)
} else {
fmt.Println("\nConfiguration help:")
fmt.Println(help)
}
}
总结
Cleanenv是一个简单而强大的Go配置管理库,它提供了:
- 多格式配置文件支持
- 环境变量覆盖机制
- 默认值设置
- 必填字段验证
- 自动生成的配置文档
对于需要轻量级配置管理的Go项目,Cleanenv是一个很好的选择,它避免了复杂配置框架的臃肿,同时提供了足够的灵活性。