golang读取配置文件和环境变量的轻量级插件库fig的使用

Golang读取配置文件和环境变量的轻量级插件库fig的使用

fig是一个用于将应用程序配置加载到Go结构体中的小型库。

fig

为什么选择fig?

  • 🛠️ 可以在单个结构体中定义配置验证默认值
  • 🌍 轻松从文件环境变量或两者加载配置
  • ⏰ 将字符串解码为TimeDurationRegexp或任何实现StringUnmarshaler接口的自定义类型
  • 🗂️ 兼容yamljsontoml文件格式
  • 🧩 仅三个外部依赖项

快速开始

安装fig:

$ go get -d github.com/kkyr/fig

示例配置

  1. 首先定义一个YAML配置文件:
# config.yaml
build: "2020-01-09T12:30:00Z"

server:
    ports:
      - 8080
    cleanup: 1h

logger:
    level: "warn"
    trace: true
  1. 然后定义对应的Go结构体:
package main

import (
  "fmt"
  "time"
  "regexp"

  "github.com/kkyr/fig"
)

type Config struct {
  Build  time.Time `fig:"build" validate:"required"`  // 必须字段
  Server struct {
    Host    string        `fig:"host" default:"127.0.0.1"`  // 默认值为127.0.0.1
    Ports   []int         `fig:"ports" default:"[80,443]"`  // 默认端口80和443
    Cleanup time.Duration `fig:"cleanup" default:"30m"`     // 默认30分钟
  }
  Logger struct {
    Level   string         `fig:"level" default:"info"`  // 默认日志级别info
    Pattern *regexp.Regexp `fig:"pattern" default:".*"`  // 默认正则表达式.*
    Trace   bool           `fig:"trace"`                 // 无默认值
  }
}

func main() {
  var cfg Config
  err := fig.Load(&cfg)  // 加载配置
  if err != nil {
    panic(err)
  }
  
  fmt.Printf("%+v\n", cfg)
  // 输出: {Build:2019-12-25T00:00:00Z Server:{Host:127.0.0.1 Ports:[8080] Cleanup:1h0m0s} Logger:{Level:warn Pattern:.* Trace:true}}
}

标记为required的字段会被检查是否为空,而default值会被应用到那些为空的字段上。

环境变量支持

默认情况下,fig只会从配置文件中查找值。要同时包含环境变量的值,可以使用UseEnv选项:

fig.Load(&cfg, fig.UseEnv("APP_PREFIX"))  // 使用APP_PREFIX作为环境变量前缀

如果存在冲突,环境变量的值将优先于配置文件中的值。

完整示例

下面是一个完整的示例,展示如何同时使用配置文件和环境变量:

package main

import (
	"fmt"
	"log"
	"os"
	"time"

	"github.com/kkyr/fig"
)

type Config struct {
	App struct {
		Name    string `fig:"name" default:"myapp"`          // 默认应用名
		Version string `fig:"version" validate:"required"`   // 必须字段
	}
	Server struct {
		Host string `fig:"host" default:"localhost"`         // 默认主机
		Port int    `fig:"port" default:"8080"`             // 默认端口
	}
	Timeout time.Duration `fig:"timeout" default:"30s"`     // 默认超时30秒
}

func main() {
	// 设置环境变量(实际使用时应在系统环境变量中设置)
	os.Setenv("APP_SERVER_HOST", "0.0.0.0")
	os.Setenv("APP_SERVER_PORT", "9000")

	var cfg Config
	err := fig.Load(&cfg,
		fig.File("config.yaml"),          // 指定配置文件
		fig.UseEnv("APP"),                // 使用APP作为环境变量前缀
		fig.Dirs(".", "/etc/myapp"),      // 搜索配置文件的目录
	)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Printf("%+v\n", cfg)
	// 输出将显示环境变量中的Host和Port覆盖了配置文件中的值
}

这个示例展示了fig的主要功能:

  1. 从YAML文件加载配置
  2. 支持环境变量覆盖
  3. 支持默认值和必填验证
  4. 支持多目录搜索配置文件

fig是一个简单但功能强大的配置加载库,特别适合需要同时支持配置文件和环境变量的Go应用程序。


更多关于golang读取配置文件和环境变量的轻量级插件库fig的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang读取配置文件和环境变量的轻量级插件库fig的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用fig库读取配置文件和环境变量

fig是一个轻量级的Go配置库,支持从配置文件和环境变量中读取配置,具有简洁的API和良好的默认值支持。下面我将详细介绍fig的使用方法。

安装fig

首先安装fig库:

go get github.com/kkyr/fig

基本用法

1. 从配置文件加载配置

假设我们有一个配置文件config.yaml

server:
  host: "localhost"
  port: 8080
  timeout: 30s
database:
  url: "postgres://user:pass@localhost:5432/db"
  pool: 10
debug: true

对应的Go结构体:

type Config struct {
    Server struct {
        Host    string        `fig:"host" default:"0.0.0.0"`
        Port    int           `fig:"port" validate:"required"`
        Timeout time.Duration `fig:"timeout"`
    }
    Database struct {
        URL  string `fig:"url" validate:"required"`
        Pool int    `fig:"pool" default:"5"`
    }
    Debug bool `fig:"debug"`
}

加载配置的代码:

package main

import (
	"fmt"
	"log"
	"time"

	"github.com/kkyr/fig"
)

func main() {
	var cfg Config
	
	// 从当前目录加载config.yaml
	err := fig.Load(&cfg)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Printf("%+v\n", cfg)
}

2. 自定义配置选项

fig提供了多种自定义选项:

err := fig.Load(&cfg,
    fig.File("app.json"),          // 指定文件名
    fig.Dirs(".", "config", "/etc/myapp"), // 搜索目录
    fig.UseEnv("MYAPP"),           // 环境变量前缀
    fig.Tag("json"),               // 使用json标签
)

3. 环境变量支持

fig可以自动从环境变量读取配置,环境变量名遵循以下规则:

  • 对于嵌套字段:PREFIX_PARENT_CHILD
  • 数组/切片:PREFIX_FIELD_0, PREFIX_FIELD_1
type Config struct {
    Host string `fig:"host" env:"HOST"` // 显式指定环境变量名
    Port int    `fig:"port"`           // 自动转换为PORT
}

设置环境变量后加载:

export MYAPP_HOST=example.com
export MYAPP_PORT=3000
err := fig.Load(&cfg, fig.UseEnv("MYAPP"))

4. 验证配置

fig支持简单的验证:

type Config struct {
    Port int `fig:"port" validate:"required,min=1,max=65535"`
}

完整示例

下面是一个完整的示例,展示fig的各种功能:

package main

import (
	"fmt"
	"log"
	"time"

	"github.com/kkyr/fig"
)

type Config struct {
	App struct {
		Name    string `fig:"name" default:"myapp"`
		Version string `fig:"version" default:"1.0.0"`
	}
	Server struct {
		Host    string        `fig:"host" default:"0.0.0.0"`
		Port    int           `fig:"port" validate:"required"`
		Timeout time.Duration `fig:"timeout" default:"30s"`
	}
	Database struct {
		URL  string `fig:"url" validate:"required"`
		Pool int    `fig:"pool" default:"5"`
	}
	Debug bool `fig:"debug" default:"false"`
}

func main() {
	var cfg Config

	// 从config.yaml加载配置,支持环境变量
	err := fig.Load(&cfg,
		fig.File("config.yaml"),
		fig.Dirs(".", "config"),
		fig.UseEnv("APP"),
	)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Printf("App Name: %s\n", cfg.App.Name)
	fmt.Printf("Server Host: %s\n", cfg.Server.Host)
	fmt.Printf("Server Port: %d\n", cfg.Server.Port)
	fmt.Printf("Database URL: %s\n", cfg.Database.URL)
	fmt.Printf("Debug Mode: %v\n", cfg.Debug)
}

支持的配置文件格式

fig支持多种配置文件格式:

  • YAML (.yml, .yaml)
  • JSON (.json)
  • TOML (.toml)
  • HCL (.hcl)

最佳实践

  1. 配置结构设计:使用嵌套结构体组织配置,保持与配置文件结构一致
  2. 默认值:为所有字段设置合理的默认值
  3. 环境变量:生产环境优先使用环境变量
  4. 验证:添加必要的验证规则
  5. 多环境配置:使用不同的配置文件或环境变量区分环境

fig是一个简单但功能齐全的配置库,适合大多数Go应用程序的配置管理需求。它的轻量级设计和灵活的选项使其成为许多项目的理想选择。

回到顶部