【问题标题】:Viper mapping environment variable to struct memberViper 将环境变量映射到结构成员
【发布时间】:2021-01-16 06:03:55
【问题描述】:

这是我的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 映射到结构成员,可能是因为我的托管服务提供商设置了 PORT env 变量,而我不能使用第二点,因为我希望使用 yaml 作为默认值。

【问题讨论】:

  • 为什么你没有为你的字段设置yaml:"server"yaml:"port",然后设置SERVER_PORT evn?
  • 正如我的托管服务提供商设置的问题中所述。 PORT 默认情况下,我不能覆盖所以SERVER_PORT 不是一个选项。我也想探索如何绑定它。

标签: go viper-go


【解决方案1】:

您可以使用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。从那里,它将被解组到您的结构中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多