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会按照以下顺序加载配置:

  1. 结构体标签中设置的默认值
  2. 从指定的配置文件加载
  3. 从带有指定前缀的环境变量加载
  4. 从带有指定前缀的命令行标志加载

注意事项

  • 如果需要自定义命令行标志,可以使用loader.Flags()获取flag.FlagSet
  • 对于YAML、JSON等文件格式的支持需要导入相应的子模块
  • 可以通过设置SkipDefaultsSkipFiles等选项跳过某些加载步骤

这个库非常适合需要从多种来源加载配置的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 会按照以下顺序加载配置,后面的会覆盖前面的:

  1. 结构体中的默认值
  2. 配置文件中的值
  3. 环境变量
  4. 命令行参数

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 是一个轻量级但功能强大的配置加载库,特别适合需要从多种来源加载配置的应用程序。它的设计简洁,易于集成到现有项目中。

回到顶部