人生路窄酒杯宽
教程看的不少, 忘得更不少, 还是要写, 先搭个脚手架吧.
使用 viper 进行配置文件的管理, 相应环境的配置文件会覆盖基础配置文件, 相同的配置可以放在基础配置文件里面
项目路径
.
├── README.md
├── app
│ └── app
├── conf
│ ├── app.yaml
│ ├── conf.go
│ └── loc.yaml
├── doc
│ └── doc
├── go.mod
├── go.sum
├── logger
│ └── logger.go
├── main.go
├── models
│ └── models
├── router
│ └── router.go
└── tests
└── test
根据环境自动切换配置文件
部署环境根据环境变量进行区分, so 只需要根据环境变量自动读取相应配置文件即可
no bb, show me the code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| func initConfig() (err error) { configType := "yml" defaultPath := "./configs" v := viper.New() v.SetConfigName("default") v.AddConfigPath(defaultPath) v.SetConfigType(configType) err = v.ReadInConfig() if err != nil { return }
configs := v.AllSettings() for k, v := range configs { viper.SetDefault(k, v) } env := os.Getenv("GO_ENV") if env != "" { viper.SetConfigName(env) viper.AddConfigPath(defaultPath) viper.SetConfigType(configType) err = viper.ReadInConfig() if err != nil { return } } return }
|
build 的时候带上配置文件吧…
虽然带着配置文件一起部署也没什么问题, 但是作为一个深夜街头放飞理想的有志青年, 还是觉得要把配置文件在配置的时候一起打包成可执行文件才是正确的解决方法
使用 packr
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| package conf
import ( "bytes" "github.com/gobuffalo/packr/v2" "github.com/spf13/viper" "os" )
func init() { box := packr.New("confBox", ".") configType := "yaml" defaultConfig, err := box.Find("app.yaml") if err != nil { panic(err) return } v := viper.New() v.SetConfigType(configType) err = v.ReadConfig(bytes.NewReader(defaultConfig)) if err != nil { panic(err) return } configs := v.AllSettings() for k, v := range configs { viper.SetDefault(k, v) }
env := os.Getenv("ENV") if env != "" { envConfig, err := box.Find(env + ".yaml") if err != nil { panic(err) return } viper.SetConfigType(configType) err = viper.ReadConfig(bytes.NewReader(envConfig)) if err != nil { panic(err) } } }
|
for build
参考 packr2
- build 项目时先使用
packr2
命令打包配置文件
- 就正常 build
- 使用
packr2 clean
清除生成的文件
Usage
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| package main
import ( "fmt" "github.com/spf13/viper" _ "goFrame/conf" )
func main() { logLevel := viper.GetString("logLevel") app := viper.GetString("app") fmt.Println(logLevel) fmt.Println(app) }
|
feature