【发布时间】:2022-01-14 06:27:01
【问题描述】:
我正在尝试编写一个只有一个命令的应用程序,因此,我想我可能会跳过 Cobra。
应用应该能够支持所有类型的配置:
- 命令行参数
- 环境变量
- 配置文件
我正在使用 viper,但我无法让它读取我的 cli 参数。
v := viper.New()
viper.SetConfigName("config")
viper.AddConfigPath(".")
v.SetDefault(pathKey, defaultPath)
fs := pflag.NewFlagSet("app", pflag.ExitOnError)
fs.String(pathKey, defaultPath, "Default path")
fs.StringSlice(wordsKey, []string{""}, "Words")
fs.String(loglevelKey, "info", "Log level")
if err := v.BindPFlags(fs); err != nil {
fmt.Println(err)
os.Exit(1)
}
if err := fs.Parse(os.Args[1:]); err != nil {
fmt.Println(err)
os.Exit(1)
}
v.AutomaticEnv()
if err := v.ReadInConfig(); err != nil {
fmt.Println("no conf file") //ignore, it can be either cli params, or conf file
}
var c conf
if err := v.Unmarshal(&c); err != nil {
fmt.Println(err)
os.Exit(1)
}
但我从来没有将 cli 参数放入 conf 结构中。在Unmarshal 之前打印v 不会显示我提供的任何cli 参数。
我错过了什么?我需要为此使用眼镜蛇吗?
还是我必须分配每个标志集标志,例如fs.String(pathKey, defaultPath, "Default path"),手动配置结构?
【问题讨论】: