背景
之前都是学 godotenv 做配置,好处是可以直接面对结构体进行索取。现在项目用 vipe 做全局 config 的配置,做一个入门记录
配置
读取
Viper 读取配置文件很简单
func readConfig() {
viper.SetConfigType("yaml")
viper.SetConfigFile("application.yaml")
setDefaultConfig()
if err := viper.ReadInConfig(); err != nil {
if _, ok := err.(viper.ConfigFileNotFoundError); ok {
panic("config file can not be founded")
}
panic("config file read error+" + err.Error())
}
}
默认参数
默认参数比较麻烦的就是需要一个个添加,不知道能不能直接设定一个对象引入默认。
// setDefaultConfig == > set default configuration properties
func setDefaultConfig() {
// mysql
viper.SetDefault("mysql.username", "root")
viper.SetDefault("mysql.password", "root")
viper.SetDefault("mysql.host", "localhost")
viper.SetDefault("mysql.port", "3306")
viper.SetDefault("mysql.dataBase", "test")
viper.SetDefault("mysql.driverName", "mysql")
}
面向结构体
开发好上面以后想要获取参数一般都是用viper.GetString()
等 get 方法来获取,不太方便的是 IDE 无法进行预填充,你也不知道 config 具体有些啥东西,所以参考之前用 godotenv 的时候引入结构体的方法来设置全局参数:
type AppConfigSchema struct {
// DataBase
Database MySQL `mapstructure:"mysql"`
DSN string
}
// MySQL == > mysql-database Yaml map to JSON
type MySQL struct {
Password string `mapstructure:"passWord"`
UserName string `mapstructure:"userName"`
Host string `mapstructure:"host"`
DriverName string `mapstructure:"driverName"`
Port string `mapstructure:"port"`
Database string `mapstructure:"dataBase"`
}
// AppConfig == > global variable
var AppConfig = AppConfigSchema{}
添加一个 init 函数:
func init() {
readConfig()
unmarshallConfig()
AppConfig.DSN = AppConfig.Database.UserName + ":" + AppConfig.Database.Password + "@tcp(" + AppConfig.Database.Host + ":" + AppConfig.Database.Port + ")/" + AppConfig.Database.Database + "?charset=utf8&parseTime=True"
}
在需要的地方这样使用:
// DSN
mysql.Open(config.AppConfig.DSN)
// other structured data
config.AppConfig.Database.Password