网站首页 » Golang,Golang基本知识 » [Golang包] viper包

[Golang包] viper包

August 10, 2021 Golang,Golang基本知识

介绍

viper 是一个配置解决方案,拥有丰富的特性

  • 支持 JSON/TOML/YAML/HCL/envfile/Java properties 等多种格式的配置文件;
  • 可以设置监听配置文件的修改,修改时自动加载新的配置;
  • 从环境变量、命令行选项和io.Reader中读取配置;
  • 从远程配置系统中读取和监听修改,如 etcd/Consul;
  • 代码逻辑中显示设置键值。

安装

go get github.com/spf13/viper

使用

读取config 文件

以下是如何使用 Viper 搜索和读取配置文件的示例。 不需要任何特定路径,但应至少提供一个需要配置文件的路径。

viper.SetConfigName("config") // name of config file (without extension)
viper.SetConfigType("yaml") // REQUIRED if the config file does not have the extension in the name
viper.AddConfigPath("/etc/appname/")   // path to look for the config file in
viper.AddConfigPath("$HOME/.appname")  // call multiple times to add many search paths
viper.AddConfigPath(".")               // optionally look for config in the working directory
err := viper.ReadInConfig() // Find and read the config file
if err != nil { // Handle errors reading the config file
    panic(fmt.Errorf("Fatal error config file: %w \n", err))
}

你可以处理找不到config 文件的特殊情况,例如:

if err := viper.ReadInConfig(); err != nil {
    if _, ok := err.(viper.ConfigFileNotFoundError); ok {
        // Config file not found; ignore error if desired
    } else {
        // Config file was found but another error was produced
    }
}

// Config file found and successfully parsed

编写config 文件

从配置文件中读取很有用,但有时您希望存储在运行时所做的所有修改。 为此,有一堆命令可用,每个命令都有自己的目的:

  • WriteConfig - 将当前 viper 配置写入预定义路径(如果存在)。 如果没有预定义路径,则会出错。 将覆盖当前的配置文件(如果存在)。
  • SafeWriteConfig - 将当前 viper 配置写入预定义路径。 如果没有预定义路径,则会出错。 如果存在,则不会覆盖当前的配置文件。
  • WriteConfigAs - 将当前 viper 配置写入给定的文件路径。 将覆盖给定的文件(如果存在)。
  • SafeWriteConfigAs - 将当前 viper 配置写入给定的文件路径。 不会覆盖给定的文件(如果存在)。

根据经验,标有安全的所有内容都不会覆盖任何文件,但如果不存在则创建,而默认行为是创建或截断。

viper.WriteConfig() // writes current config to predefined path set by 'viper.AddConfigPath()' and 'viper.SetConfigName'
viper.SafeWriteConfig()
viper.WriteConfigAs("/path/to/my/.config")
viper.SafeWriteConfigAs("/path/to/my/.config") // will error since it has already been written
viper.SafeWriteConfigAs("/path/to/my/.other_config")
添加新评论