Go语言 viper不会从env或pflags中解组值

3ks5zfa0  于 2023-09-28  发布在  Go
关注(0)|答案(2)|浏览(118)

下面是一个非常简单的go程序

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/spf13/cobra"
  5. "github.com/spf13/viper"
  6. )
  7. type Config struct {
  8. AFlag string `mapstructure:"A_FLAG"`
  9. }
  10. var rootCmd = &cobra.Command{
  11. Use: "myapp",
  12. Short: "My app",
  13. Run: func(cmd *cobra.Command, args []string) {
  14. fmt.Println("running")
  15. },
  16. }
  17. func InitConfig(cmd *cobra.Command) {
  18. var conf Config
  19. v := viper.New()
  20. v.AddConfigPath(".")
  21. v.SetConfigName(".env")
  22. v.SetConfigType("env")
  23. v.SetEnvPrefix("FOO")
  24. v.AllowEmptyEnv(true)
  25. v.AutomaticEnv()
  26. v.BindPFlags(cmd.Flags())
  27. v.Unmarshal(&conf)
  28. fmt.Printf("%+v\n", conf)
  29. }
  30. func main() {
  31. rootCmd.PersistentFlags().StringP("a-flag", "", "", "a flag")
  32. InitConfig(rootCmd)
  33. rootCmd.Execute()
  34. }

  1. export FOO_A_FLAG=test

或者以

  1. go run main.go --a-flag=test

程序应该正在打印

  1. {AFlag:test}
  2. running

但是,它似乎没有考虑env var(带前缀)和标志

  1. {AFlag:}
  2. running
7eumitmz

7eumitmz1#

我想你是导出错误的env变量。请尝试使用:export A_FLAG=test
您可以参考以下链接以获得一些参考:
https://renehernandez.io/snippets/bind-environment-variables-to-config-struct-with-viper/

7y4bm7vi

7y4bm7vi2#

试试这个

  1. viper.SetConfigName("local")
  2. viper.SetConfigType(".env")
  3. viper.AddConfigPath("./config")
  4. if err := viper.ReadInConfig(); err != nil {
  5. panic(ErrorsWrap(err, "error occured while reading env file"))
  6. }
  7. if err := viper.Unmarshal(&Env); err != nil {
  8. panic(ErrorsWrap(err, "error occured while unmarshalling env data"))
  9. }

相关问题