1

我们正在使用 Viper 读取和解析我们的配置文件,所有这些都可以正常工作。

但是,我们无法使用 env 变量覆盖我们的一些配置值。这些是配置绑定到结构或结构数组的特定用例。

这是我们的 config.yaml 中的一个示例:

app:
    verifiers:
      - name: "test1"
        url: "http://test1.url"
        cache: "5000ms"
      - name: "test2"
        url: "http://test2.url"
        cache: "10000ms"

绑定到以下结构(golang):

type App struct {
    AppConfig   Config      `yaml:"app" mapstructure:"app"`
}

type Config struct {
    Verifiers []VerifierConfig `json:"verifiers"         yaml:"verifiers"         mapstructure:"verifiers"`
}

type VerifierConfig struct {
    Name     string            `json:"name"                   yaml:"name"                   mapstructure:"name"`
    URL      string            `json:"url,omitempty"          yaml:"url,omitempty"          mapstructure:"url"`
    cache    jsontime.Duration `json:"cache"                  yaml:"cache"                  mapstructure:"cache"`
}

我们无法使用环境变量覆盖验证器的值。

以下是我们使用的 Viper 选项:

viper.AutomaticEnv()
viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))

有没有人遇到过类似的问题,或者可以确认 Viper 不支持这样的用例?

任何指针将不胜感激。

谢谢

4

1 回答 1

2

viper 无法读取配置文件中的环境变量。您必须在使用值的 .go 文件中替换它们。这是我如何实现的示例:

要求 Viper 考虑带有“ENV”前缀的系统环境变量,这意味着 viper 期望“ENV_MONGO_USER”和“ENV_MONGO_PASSWORD”作为系统环境变量

viper.AutomaticEnv()
viper.SetEnvPrefix(viper.GetString("ENV"))
viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))

在 yml 文件中:

mongodb:
 url: "mongodb+srv://${username}:${password}@xxxxxxx.mongodb.net/"
 database: "test" 

在 mongodb 连接文件中:(在建立 db 连接之前,将 ${username} 和 ${password} 替换为各自的环境变量,但viper 会读取这些变量而不带前缀

const BasePath = "mongodb"
mongoDbUrl := viper.GetString(fmt.Sprintf("%s.%s", BasePath, "url"))
username := viper.GetString("MONGO_USER")
password := viper.GetString("MONGO_PASSWORD")
replacer := strings.NewReplacer("${username}", username, "${password}", password)
mongoDbUrl = replacer.Replace(mongoDbUrl)
于 2020-10-05T13:32:55.037 回答