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

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

下面是一个非常简单的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("%+v\n", 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
7eumitmz

7eumitmz1#

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

7y4bm7vi

7y4bm7vi2#

试试这个

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"))
    }

相关问题