微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Viper 将环境变量映射到结构成员

如何解决Viper 将环境变量映射到结构成员

这是我的 config.yaml 文件

server:
  port: 5000

这是我使用 viper 解组的逻辑

type Configurations struct {
    Server ServerConfig
}

type ServerConfig struct {
    Port int
}

// LoadConfig reads configuration from file or environment variables.
func LoadConfig(path string) (config Configurations,err error) {
    viper.AddConfigPath(path)
    viper.SetConfigName("config")
    viper.SetConfigType("yaml")

    viper.AutomaticEnv()

    err = viper.ReadInConfig()
    if err != nil {
        return
    }

    err = viper.Unmarshal(&config)
    return
}

我已经设置了环境变量 export PORT=9000,现在我的问题是如何将环境变量 PORT 映射到 Configurations.ServerConfig.Port。 我想要具有 dev 的认值的配置文件,并希望我的应用程序从生产环境变量读取/覆盖配置,我如何使用 viper 实现这一点。

我看到以下选项

  1. 设置SERVER_PORT,然后使用如下所示的替换器将其解组为结构
replacer := strings.NewReplacer(".","_")
viper.SetEnvKeyReplacer(replacer)
  1. Go viper .yaml values environment variables override

但我想将变量 PORT 映射到 struct 成员,可能是因为我的托管服务提供商设置了 PORT env 变量,我不能使用第二点,因为我想认使用 yaml价值。

解决方法

您可以使用 viper.BindEnv(string...) error 将特定的环境变量绑定到配置。

来自Working with Environment Variables

BindEnv 接受一个或多个参数。第一个参数是键名,其余是要绑定到这个键的环境变量的名称。如果提供了多个,它们将按指定的顺序优先。

这里端口的配置键是server.port,环境变量PORT应该绑定到它。

...
viper.AutomaticEnv()


err = viper.BindEnv("server.port","PORT")
if err != nil {
    return
}


err = viper.ReadInConfig()
...

有了这个改变,像 PORT=9999 ./yourbinary 这样的调用会拿起 PORT 并将它写入 server.port。从那里,它将被解组到您的结构中。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。