golang轻量级配置管理工具插件库store的使用

Golang轻量级配置管理工具插件库store的使用

Store是一个用于Go应用程序的极简配置管理工具。它支持JSON、TOML和YAML格式,并允许你注册任何其他配置格式。

基本使用示例

package main

import (
	"log"
	"time"

	"github.com/tucnak/store"
)

func init() {
	// 必须先用一个唯一路径初始化store
	store.Init("cats-n-dogs/project-hotel")
}

type Cat struct {
	Name   string `toml:"naym"`
	Clever bool   `toml:"ayy"`
}

type Hotel struct {
	Name string
	Cats []Cat `toml:"guests"`

	Opens  *time.Time
	Closes *time.Time
}

func main() {
	var hotel Hotel

	// 从TOML文件加载配置
	if err := store.Load("hotel.toml", &hotel); err != nil {
		log.Println("failed to load the cat hotel:", err)
		return
	}

	// ... 在这里可以修改hotel结构体的值

	// 将配置保存回TOML文件
	if err := store.Save("hotel.toml", &hotel); err != nil {
		log.Println("failed to save the cat hotel:", err)
		return
	}
}

注册自定义格式

Store支持通过注册系统添加任何其他格式:

// 注册INI格式的编解码器
store.Register("ini", ini.Marshal, ini.Unmarshal)

// 现在可以加载INI格式的配置文件了
err := store.Load("configuration.ini", &object)
// ...

特性说明

  1. 支持JSON、TOML和YAML格式开箱即用
  2. 可以轻松注册其他配置格式
  3. 在Linux上将配置保存在$XDG_CONFIG_HOME$HOME目录
  4. 在Windows上将配置保存在%APPDATA%目录
  5. 使用简单直观的API:LoadSave

Store是为小型项目设计的轻量级解决方案,避免了像viper这样的复杂配置管理工具的复杂性。


更多关于golang轻量级配置管理工具插件库store的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang轻量级配置管理工具插件库store的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang轻量级配置管理工具插件库store使用指南

store是一个轻量级的Go语言配置管理库,支持多种配置源,包括文件、环境变量、命令行参数等。下面我将详细介绍store库的使用方法。

安装

go get github.com/tucnak/store

基本使用

1. 初始化配置

package main

import (
	"fmt"
	"github.com/tucnak/store"
)

type Config struct {
	Server struct {
		Host string `json:"host"`
		Port int    `json:"port"`
	} `json:"server"`
	Database struct {
		User     string `json:"user"`
		Password string `json:"password"`
	} `json:"database"`
}

func main() {
	var config Config
	
	// 设置默认值
	config.Server.Host = "localhost"
	config.Server.Port = 8080
	
	// 初始化store
	err := store.Init("config.json")
	if err != nil {
		fmt.Println("Failed to initialize store:", err)
		return
	}
	
	// 加载配置
	if err := store.Load(&config); err != nil {
		fmt.Println("Failed to load config:", err)
		return
	}
	
	// 保存配置
	if err := store.Save(&config); err != nil {
		fmt.Println("Failed to save config:", err)
		return
	}
	
	fmt.Printf("Config loaded: %+v\n", config)
}

2. 支持多种配置源

store支持多种配置源,可以通过store.Add方法添加:

// 添加环境变量配置源
store.Add("env", store.NewEnvironment())

// 添加命令行参数配置源
store.Add("flag", store.NewFlag())

// 添加JSON文件配置源
store.Add("json", store.NewJSON("config.json"))

// 添加YAML文件配置源
store.Add("yaml", store.NewYAML("config.yaml"))

// 添加TOML文件配置源
store.Add("toml", store.NewTOML("config.toml"))

3. 配置优先级

配置源按照添加的顺序加载,后添加的配置源会覆盖前面配置源的值:

// 先加载JSON文件
store.Add("json", store.NewJSON("config.json"))

// 然后加载环境变量,环境变量的值会覆盖JSON文件中的值
store.Add("env", store.NewEnvironment())

// 最后加载命令行参数,优先级最高
store.Add("flag", store.NewFlag())

4. 环境变量和命令行参数映射

在结构体中使用store标签指定环境变量和命令行参数的名称:

type Config struct {
	Server struct {
		Host string `json:"host" store:"SERVER_HOST"`
		Port int    `json:"port" store:"SERVER_PORT"`
	} `json:"server"`
	Database struct {
		User     string `json:"user" store:"DB_USER"`
		Password string `json:"password" store:"DB_PASSWORD"`
	} `json:"database"`
}

5. 监听配置变化

store支持监听配置文件变化并自动重新加载:

// 启用监听
store.Watch()

// 设置变化回调
store.OnChange(func() {
	fmt.Println("Configuration changed!")
	var newConfig Config
	if err := store.Load(&newConfig); err == nil {
		fmt.Printf("New config: %+v\n", newConfig)
	}
})

高级用法

1. 自定义配置源

你可以实现自己的配置源:

type CustomSource struct{}

func (cs *CustomSource) Read(config interface{}) error {
	// 实现读取逻辑
	return nil
}

func (cs *CustomSource) Write(config interface{}) error {
	// 实现写入逻辑
	return nil
}

// 使用自定义配置源
store.Add("custom", &CustomSource{})

2. 多文件配置

// 主配置文件
store.Add("json", store.NewJSON("config.json"))

// 本地覆盖配置(如开发环境特定配置)
store.Add("json-local", store.NewJSON("config.local.json"))

3. 配置验证

func validateConfig(c Config) error {
	if c.Server.Port <= 0 || c.Server.Port > 65535 {
		return fmt.Errorf("invalid port number: %d", c.Server.Port)
	}
	if c.Database.User == "" {
		return errors.New("database user cannot be empty")
	}
	return nil
}

// 加载时验证
if err := store.Load(&config); err != nil {
	// 处理错误
}
if err := validateConfig(config); err != nil {
	// 处理验证错误
}

最佳实践

  1. 配置分层:将配置分为基础配置和环境特定配置
  2. 敏感信息:不要将密码等敏感信息直接存储在配置文件中,考虑使用环境变量或密钥管理服务
  3. 默认值:为所有配置项设置合理的默认值
  4. 文档化:为配置结构体和字段添加注释说明

store库简单易用,适合中小型项目的配置管理需求。对于更复杂的场景,可以考虑使用viper等更强大的配置管理库。

回到顶部