我有以下非常简单的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"))
}