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

这是我的简化配置:


stripe:

  secret_key: sk_fromconfig

为什么毒蛇不从环境中获取价值?


% 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")但没有用。


慕少森
浏览 117回答 1
1回答

牛魔王的故事

使用viper.SetEnvKeyReplacer,因为它不会自动替换.为_viper.SetEnvKeyReplacer(strings.NewReplacer(`.`,`_`))所以它正在寻找环境变量STRIPE.SECRET_KEY,但由于大多数 shell 不允许在环境变量名称中使用点,因此我们必须将其替换为下划线。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go