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

Yus*_*fmm 3 go viper-go

这是我的简化配置:

stripe:
  secret_key: sk_fromconfig
Run Code Online (Sandbox Code Playgroud)

为什么 viper 不从 env 获取值?

% echo $STRIPE_SECRET_KEY
sk_fromenv
% go run main.go 
sk_fromconfig
Run Code Online (Sandbox Code Playgroud)

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

% echo $STRIPE_SECRET_KEY
sk_fromenv
% go run main.go 
sk_fromenv
Run Code Online (Sandbox Code Playgroud)

这是代码:

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)
}
Run Code Online (Sandbox Code Playgroud)

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

Kok*_*zzu 7

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

viper.SetEnvKeyReplacer(strings.NewReplacer(`.`,`_`))
Run Code Online (Sandbox Code Playgroud)

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