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
更多关于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)
}
注意事项
- 环境变量名区分大小写
- 未设置且无默认值的环境变量会导致解析错误
- 对于布尔值,字符串 “true”/“false” 会被自动转换
- 数字字符串会自动转换为对应的数字类型
envyaml 是一个轻量级的解决方案,适合需要在 YAML 配置中灵活使用环境变量的场景。相比其他配置库,它专注于环境变量替换这一特定功能,保持了简单和专注的设计理念。