2

这是我的config.yaml文件

server:
  port: 5000

这是我使用毒蛇解组的逻辑

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
}

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

我看到以下选项

  1. 设置SERVER_PORT然后使用如下替换器将其解组为结构
replacer := strings.NewReplacer(".", "_")
viper.SetEnvKeyReplacer(replacer)
  1. Go viper .yaml 值环境变量覆盖

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

4

1 回答 1

4

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

使用环境变量

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

于 2021-01-16T06:40:07.583 回答