golang Yaml环境变量配置解析插件库envyaml的使用

Golang YAML环境变量配置解析插件库envyaml的使用

概述

envYaml是一个支持环境变量加载的YAML解析库,它允许你在YAML配置文件中无缝集成环境变量。使用YAML文件存储应用配置是一个简洁直接的解决方案,但需要避免暴露密码和API密钥等敏感数据。环境变量提供了存储密钥的安全方式,防止它们泄露到代码库中。

envyaml包可以让你:

  • 保持YAML配置的整洁和组织性
  • 通过环境变量保护敏感数据
  • 享受简单直观的集成过程

安装

使用go get安装envyaml:

go get github.com/yuseferi/envyaml@latest

使用示例

示例1:必需环境变量未设置时报错

type TestConfig struct {
    Host     string `yaml:"host" env:"TEST_HOST"`
    Port     int    `yaml:"port" env:"TEST_PORT"`
    Password string `yaml:"password" env:"TEST_PASSWORD,required"`
}

// 加载配置
var cfg TestConfig
// 假设你的配置文件是config.yml,内容如下:
// host: localhost
// port: 3606
// password: ${TEST_PASSWORD}
err := envyaml.LoadConfig("config.yml", &cfg)
if err != nil {
    log.Fatalln(err)
}
fmt.Println(cfg)

TEST_PASSWORD环境变量未设置时,会报错:failed to parse environment variables: env: required environment variable "TEST_PASSWORD" is not set

示例2:环境变量已定义时

type TestConfig struct {
    Host     string `yaml:"host" env:"TEST_HOST"`
    Port     int    `yaml:"port" env:"TEST_PORT"`
    Password string `yaml:"password" env:"TEST_PASSWORD,required"`
}

// 加载配置
var cfg TestConfig
// 假设你的配置文件是config.yml,内容如下:
// host: localhost
// port: 3606
// password: ${TEST_PASSWORD}
_ = os.Setenv("TEST_PASSWORD", "envyaml_pass")
err := envyaml.LoadConfig("config.yml", &cfg)
if err != nil {
    log.Fatalln(err)
}
fmt.Println(cfg)

预期输出:

{localhost 3606 envyaml_pass}

开发

该项目使用Task管理开发任务。确保你的系统已安装Task。

可用任务

  • task build: 构建项目
  • task test: 运行测试
  • task test-coverage: 运行测试并生成覆盖率报告
  • task clean: 清理生成的文件
  • task all: 运行所有任务(构建、测试和覆盖率)

运行任务示例:

task build

运行测试

运行测试:

task test

运行测试并生成覆盖率报告:

task test-coverage

这会生成HTML格式的覆盖率报告(coverage.html)。

贡献

我们强烈相信开源精神❤️😊。欢迎通过提交问题和拉取请求来贡献代码,让envYaml变得更好!

许可证

根据GNU GENERAL PUBLIC LICENSE发布。


更多关于golang Yaml环境变量配置解析插件库envyaml的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang Yaml环境变量配置解析插件库envyaml的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用 envyaml 解析 YAML 环境变量配置

envyaml 是一个 Go 语言库,用于解析 YAML 配置文件并支持环境变量替换。它结合了 YAML 配置的灵活性和环境变量的便利性。

安装

go get github.com/rotemtam/envyaml

基本用法

1. 简单示例

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

database:
  host: ${DB_HOST:localhost}
  port: ${DB_PORT:5432}
  username: ${DB_USER}
  password: ${DB_PASSWORD}

解析代码:

package main

import (
	"fmt"
	"os"

	"github.com/rotemtam/envyaml"
)

func main() {
	// 设置环境变量
	os.Setenv("DB_HOST", "db.example.com")
	os.Setenv("DB_USER", "admin")
	os.Setenv("DB_PASSWORD", "secret123")

	// 解析配置文件
	var config struct {
		Database struct {
			Host     string `yaml:"host"`
			Port     int    `yaml:"port"`
			Username string `yaml:"username"`
			Password string `yaml:"password"`
		} `yaml:"database"`
	}

	err := envyaml.UnmarshalFile("config.yaml", &config)
	if err != nil {
		panic(err)
	}

	fmt.Printf("Database config: %+v\n", config.Database)
}

2. 环境变量替换规则

  • ${VAR} - 必须存在的环境变量
  • ${VAR:default} - 可选的带默认值的环境变量
  • $${VAR} - 字面量 ${VAR},不会被替换

3. 高级用法

从字节切片解析

yamlData := []byte(`
app:
  name: ${APP_NAME:MyApp}
  debug: ${APP_DEBUG:false}
`)

var cfg struct {
	App struct {
		Name  string `yaml:"name"`
		Debug bool   `yaml:"debug"`
	} `yaml:"app"`
}

err := envyaml.Unmarshal(yamlData, &cfg)
if err != nil {
	panic(err)
}

自定义环境变量查找函数

customLookup := func(key string) (string, bool) {
	if key == "SECRET_KEY" {
		return "custom-secret-value", true
	}
	return "", false
}

err := envyaml.UnmarshalWithLookup(yamlData, &cfg, customLookup)

实际应用示例

配置结构体

type Config struct {
	App struct {
		Name    string `yaml:"name"`
		Version string `yaml:"version"`
		Debug   bool   `yaml:"debug"`
	} `yaml:"app"`

	Server struct {
		Host string `yaml:"host"`
		Port int    `yaml:"port"`
	} `yaml:"server"`

	Database struct {
		DSN string `yaml:"dsn"`
	} `yaml:"database"`
}

配置文件

config.yaml:

app:
  name: ${APP_NAME:MyGoApp}
  version: ${APP_VERSION:1.0.0}
  debug: ${APP_DEBUG:false}

server:
  host: ${SERVER_HOST:0.0.0.0}
  port: ${SERVER_PORT:8080}

database:
  dsn: postgres://${DB_USER}:${DB_PASSWORD}@${DB_HOST:localhost}:${DB_PORT:5432}/${DB_NAME}?sslmode=disable

完整解析代码

package main

import (
	"fmt"
	"os"

	"github.com/rotemtam/envyaml"
)

func main() {
	// 设置环境变量
	os.Setenv("APP_NAME", "ProductionApp")
	os.Setenv("DB_USER", "prod_user")
	os.Setenv("DB_PASSWORD", "prod_pass123")
	os.Setenv("DB_HOST", "db.prod.example.com")
	os.Setenv("DB_NAME", "production_db")

	var cfg Config
	err := envyaml.UnmarshalFile("config.yaml", &cfg)
	if err != nil {
		panic(err)
	}

	fmt.Printf("App Config: %+v\n", cfg.App)
	fmt.Printf("Server Config: %+v\n", cfg.Server)
	fmt.Printf("Database DSN: %s\n", cfg.Database.DSN)
}

注意事项

  1. 环境变量名区分大小写
  2. 未设置且无默认值的环境变量会导致解析错误
  3. 对于布尔值,字符串 “true”/“false” 会被自动转换
  4. 数字字符串会自动转换为对应的数字类型

envyaml 是一个轻量级的解决方案,适合需要在 YAML 配置中灵活使用环境变量的场景。相比其他配置库,它专注于环境变量替换这一特定功能,保持了简单和专注的设计理念。

回到顶部