无法从 env 获取嵌套密钥以使用 viper 覆盖 yaml 配置文件

Can't get nested key from env to override yaml config file using viper

这是我的简化配置:

stripe:
  secret_key: sk_fromconfig

为什么 viper 不从 env 中获取值?

% echo $STRIPE_SECRET_KEY
sk_fromenv
% go run main.go 
sk_fromconfig

我希望它从 env 中获取价值,因为我有这样一个:

% echo $STRIPE_SECRET_KEY
sk_fromenv
% go run main.go 
sk_fromenv

代码如下:

package main

import (
    "fmt"

    viper "github.com/spf13/viper"
)

type Config struct {
    Stripe Stripe
}

type Stripe struct {
    SecretKey string `mapstructure:"secret_key"`
}

func main() {
    viper.SetConfigName("config")
    viper.SetConfigType("yaml")
    viper.AddConfigPath(".")

    viper.AutomaticEnv()
    _ = viper.ReadInConfig()

    var config Config
    _ = viper.Unmarshal(&config)

    fmt.Println(config.Stripe.SecretKey)
}

我尝试了 viper.BindEnv("STRIPE_SECRET_KEY")viper.SetEnvPrefix("STRIPE") 但没有成功。

使用viper.SetEnvKeyReplacer,因为它不会自动从.替换为_

viper.SetEnvKeyReplacer(strings.NewReplacer(`.`,`_`))

所以它正在寻找环境变量 STRIPE.SECRET_KEY 但由于大多数 shell 不允许在环境变量名称中使用点,我们必须将其替换为下划线。