viper既不从env也不从pflags解组值



我有以下非常简单的go程序

package main
import (
"fmt"
"github.com/spf13/cobra"
"github.com/spf13/viper"
)
type Config struct {
AFlag string `mapstructure:"A_FLAG"`
}
var rootCmd = &cobra.Command{
Use:   "myapp",
Short: "My app",
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("running")
},
}
func InitConfig(cmd *cobra.Command) {
var conf Config
v := viper.New()
v.AddConfigPath(".")
v.SetConfigName(".env")
v.SetConfigType("env")
v.SetEnvPrefix("FOO")
v.AllowEmptyEnv(true)
v.AutomaticEnv()
v.BindPFlags(cmd.Flags())
v.Unmarshal(&conf)
fmt.Printf("%+vn", conf)
}
func main() {
rootCmd.PersistentFlags().StringP("a-flag", "", "", "a flag")
InitConfig(rootCmd)
rootCmd.Execute()
}

export FOO_A_FLAG=test

或作为

运行
go run main.go --a-flag=test
程序应该打印
{AFlag:test}
running

然而,它似乎没有考虑到env var(带前缀)和标志

{AFlag:}
running

我认为你输出错误的环境变量。尝试使用:export A_FLAG=test相反。

你可以参考下面的链接:

https://renehernandez.io/snippets/bind-environment-variables-to-config-struct-with-viper/

试试这个

viper.SetConfigName("local")
viper.SetConfigType(".env")
viper.AddConfigPath("./config")     
if err := viper.ReadInConfig(); err != nil {
panic(ErrorsWrap(err, "error occured while reading env file"))
}
if err := viper.Unmarshal(&Env); err != nil {
panic(ErrorsWrap(err, "error occured while unmarshalling env data"))
}

相关内容

  • 没有找到相关文章

最新更新