无法从 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 不允许在环境变量名称中使用点,我们必须将其替换为下划线。
这是我的简化配置:
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 不允许在环境变量名称中使用点,我们必须将其替换为下划线。