loraserver 由 cobra 完成 配置
为了方便理解 loraserver 的配置
我这里利用 cobra 生成一个简单的配置程序
cobra init cfgdemo
假定我写了下面的配置文件。 toml格式的文件是cobra原生支持的
[GENERAL] #大小写忽略
log_level = 42
[redis]
url="redis://localhost:6379"
# 空格 被忽略 不参与解析
[network_server]
net_id="000000"
# 多层嵌套
[network_server.band]
name="EU_863_870"
[network_server.api]
bind="i am bind"
我只要依照上面配置文件的结构定义一个结构体,就可以借助 viper 解析出来
~/go/gopath/src/cfgdemo $ cat config/config.go
package config
type Config struct {
General struct {
LogLevel int `mapstructure:"log_level"`
}
Redis struct {
URL string `mapstructure:"url"`
}
NetworkServer struct {
NetID string `mapstructure:"net_id"`
Band struct {
Name string
}
Api struct {
Bind string
}
} `mapstructure:"network_server"`
}
var C Config
NetworkServer 用于解析 network_server
需要加上
`mapstructure:"network_server"`
func initConfig() {
if cfgFile != "" {
b, err := ioutil.ReadFile(cfgFile)
if err != nil {
log.WithError(err).WithField("config", cfgFile).Fatal("error loading config file")
}
viper.SetConfigType("toml")
if err := viper.ReadConfig(bytes.NewBuffer(b)); err != nil {
log.WithError(err).WithField("config", cfgFile).Fatal("error loading config file")
}
} else {
viper.SetConfigName("cfgdemo")
viper.AddConfigPath(".")
if err := viper.ReadInConfig(); err != nil {
switch err.(type) {
case viper.ConfigFileNotFoundError:
log.Warning("No configuration file found, using defaults.")
default:
log.WithError(err).Fatal("read configuration file error")
}
}
}
// Unmarshal 一下就可以把 cfgdemo.toml 的配置转换成config.C结构体变量 很方便啊~~~~
if err := viper.Unmarshal(&config.C); err != nil {
log.WithError(err).Fatal("unmarshal config error")
}
log.Print(config.C)
}
可以在 init函数里 指定 初值
func init() {
cobra.OnInitialize(initConfig)
// Here you will define your flags and configuration settings.
// Cobra supports persistent flags, which, if defined here,
// will be global for your application.
rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.cfgdemo.yaml)")
// Cobra also supports local flags, which will only run
// when this action is called directly.
rootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
viper.SetDefault("General.log_level", 2)
viper.SetDefault("network_server.net_id", "000000")
viper.SetDefault("network_server.band.name", "EU_863_870")
viper.SetDefault("network_server.api.bind", "0.0.0.0:8000")
}
~/go/gopath/src/cfgdemo $ go run main.go
INFO[0000] {{42} {redis://localhost:6379} {000000 {EU_863_870} {i am bind}}}
loraserver 的配置解析差不多就是这个样子,只是它的结构体复杂一些