登录
首页 >  Golang >  Go问答

使用环境变量配置 YAML 文件

来源:stackoverflow

时间:2024-03-21 19:39:50 160浏览 收藏

使用环境变量配置 YAML 文件可以通过多种方式实现。一种方法是使用反射库解析 YAML 文件,然后更新其值以匹配环境变量。另一种方法是实现一个自定义 YAML 解码器,它可以处理包含环境变量的 YAML 属性。通过这些方法,可以动态地从环境变量中配置 YAML 文件,而无需手动编辑文件。

问题内容

我有一个 go 脚本,可以在呼叫报告中生成寻呼机职责,并且它有自己的 config.yaml 文件,如下所示:

# pagerduty auth token
pdauthtoken: 12345

# explicitly set report time range (rfc822)
reporttimerange:
  start: 01 jan 20 00:00 utc
  end: 01 feb 20 00:00 utc

# rotation general information
rotationinfo:
  dailyrotationstartsat: 8
  checkrotationchangeevery: 30 # minutes

我需要在 config.yaml 文件中传递环境变量。我尝试使用 ${the_variable}

reportTimeRange:
    start: ${THE_VARIABLE}

任何人都可以帮助我如何在 config.yaml 文件中传递我的 linux 环境变量,而无需编辑脚本。


正确答案


解组 yaml 文件后,您可以在结果上使用 reflect 来更新其值与您选择的变量格式匹配的任何 string 字段。

var revar = regexp.mustcompile(`^\${(\w+)}$`)

func fromenv(v interface{}) {
    _fromenv(reflect.valueof(v).elem())// assumes pointer to struct
}

// recursive
func _fromenv(rv reflect.value) {
    for i := 0; i < rv.numfield(); i++ {
        fv := rv.field(i)
        if fv.kind() == reflect.ptr {
            fv = fv.elem()
        }
        if fv.kind() == reflect.struct {
            _fromenv(fv)
            continue
        }
        if fv.kind() == reflect.string {
            match := revar.findstringsubmatch(fv.string())
            if len(match) > 1 {
                fv.setstring(os.getenv(match[1]))
            }
        }
    }
}

https://play.golang.org/p/1zuK7Mhtvsa

或者,您可以声明实现 yaml.unmarshaler 接口的类型,并将这些类型用于配置结构中期望相应 yaml 属性包含环境变量的字段。

type Config struct {
    ReportTimeRange struct {
        Start StringFromEnv `yaml:"start"`
    } `yaml:"reportTimeRange"`
}

var reVar = regexp.MustCompile(`^\${(\w+)}$`)

type StringFromEnv string

func (e *StringFromEnv) UnmarshalYAML(value *yaml.Node) error {
    var s string
    if err := value.Decode(&s); err != nil {
        return err
    }
    if match := reVar.FindStringSubmatch(s); len(match) > 0 {
        *e = StringFromEnv(os.Getenv(match[1]))
    } else {
        *e = StringFromEnv(s)
    }
    return nil
}

https://play.golang.org/p/Zy0rXJ7RRdC

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>