go 配置文件

人生路窄酒杯宽

教程看的不少, 忘得更不少, 还是要写, 先搭个脚手架吧.

使用 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()
// 从default中读取默认的配置
v.SetConfigName("default")
v.AddConfigPath(defaultPath)
v.SetConfigType(configType)
err = v.ReadInConfig()
if err != nil {
return
}

configs := v.AllSettings()
// 将default中的配置全部以默认配置写入
for k, v := range configs {
viper.SetDefault(k, v)
}
env := os.Getenv("GO_ENV")
// 根据配置的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() {
//读取文件 使用 packr 方法可以在 build 时 将配置文件打包
box := packr.New("confBox", ".")
configType := "yaml"
defaultConfig, err := box.Find("app.yaml")
if err != nil {
panic(err)
return
}
//创建一个新实例 用来读取 app.yaml 初始文件 并保存为默认配置
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

  1. build 项目时先使用 packr2 命令打包配置文件
  2. 就正常 build
  3. 使用 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

  • consul