使用viper读取配置文件

使用viper读取配置文件

August 13, 2023
后端开发
配置

viper是一款使用go语言开发的配置文件读取库,支持多种配置文件格式,包括yaml、json、toml等。viper还支持从环境变量读取配置,从远程配置中心读取配置。 本文仅介绍viper读取本地配置文件的使用方法。

安装viper #

go get https://github.com/spf13/viper

读取本地yaml文件 #

在当前项目目录下新建yaml文件config.yaml,内容如下:

version: "0.0.1"
databases:
  -
    name: "db0"
    host: "localhost"
    port: 3306
    user: "root"
    pwd: "123456"
    dbname: "user"

  -
    name: "db1"
    host: "localhost"
    port: 3307
    user: "root"
    pwd: "123456"
    dbname: "user"

在上面,我们定义了一个version字段,和一个databasess数组,数组中包含两个元素,每个元素都是一个map,包含了数据库的配置信息。

接下来,我们使用viper读取这个配置文件:

package viperdemo

import (
	"github.com/spf13/viper"
	"os"
	"testing"
)

// DatabaseCofig 数据库配置
type DatabaseConfig struct {
	Name     string `mapstructure:"name"`
	Host     string `mapstructure:"host"`
	Port     int    `mapstructure:"port"`
	Username string `mapstructure:"user"`
	Password string `mapstructure:"pwd"`
	Database string `mapstructure:"dbname"`
}

func TestReadDemo1(t *testing.T) {
	// 设置配置文件 名称
	viper.SetConfigName("config.yaml")
	// 设置配置文件类型
	viper.SetConfigType("yaml")
	// 添加配置文件路径
	viper.AddConfigPath("./")

	// 读取配置文件
	if err := viper.ReadInConfig(); err != nil {
		t.Fatal(err)
		return
	}

	// 读取 version 字段
	t.Log(viper.Get("version"))

	var databases []DatabaseConfig

	// 解析数据库配置
	if err := viper.UnmarshalKey("databases", &databases); err != nil {
		t.Fatal(err)
		return
	}

	for _, item := range databases {
		t.Log(item)
	}

}

在上面的代码中,我们将数据库配置解析到了一个切片中,切片中的每个元素都是一个DatabaseConfig对象。

运行之后,输入如下: 读取配置结果

根据环境读取本地yaml文件 #

我们可能会面临这样一个场景:在开发/测试/生产环境中读取不同的配置文件。这时候,我们可以读取环境变量来判断 是什么环境,然后读取不同的配置文件。下面给示例: 首先,定义两个配置文件dev_env.yaml、test_env.yaml,内容分别为:

version: "dev_0.0.1"
version: "test_0.0.1"

接下来,我们使用viper读取这两个配置文件:

func TestReadDemo2(t *testing.T) {

	// 设置环境变量为dev
	if err := os.Setenv("ENV_VIPER", "test"); err != nil {
		t.Fatal(err)
		return
	}

	viperEnv := os.Getenv("ENV_VIPER")

	viper.SetConfigName(viperEnv + "_env.yaml")
	viper.SetConfigType("yaml")
	viper.AddConfigPath("./")
	// 环境变量前缀,配置文件中的变量名为:$ENV_VIPER_config.yaml

	if err := viper.ReadInConfig(); err != nil {
		t.Fatal(err)
		return
	}

	t.Log(viper.Get("version"))
}

运行之后,输入如下: 读取配置结果