TOC

Viper: Go 项目配置管理

  • main.go

    package main
    
    import (
        "fmt"
        "os"
    
        "github.com/spf13/pflag"
        "github.com/spf13/viper"
    )
    
    func main() {
        // 1. 设置 Viper 配置
        viper.SetConfigName("config") // 配置文件名(不带后缀)
        viper.AddConfigPath(".")      // 配置文件路径
        viper.SetConfigType("yaml")   // 配置文件类型
        viper.AutomaticEnv()          // 自动读取环境变量
    
        // 2. 设置命令行参数
        pflag.String("name", "", "project name")
        pflag.String("host", "", "host address")
        pflag.String("port", "", "port number")
        pflag.String("config", "./config.yaml", "config file") // 配置文件参数
        pflag.Parse()
        viper.BindPFlags(pflag.CommandLine) // 将命令行参数绑定到 Viper
    
        // 3. 读取配置文件
        if configFile := viper.GetString("config"); configFile != "" {
            fmt.Println(configFile)
            if err := viper.ReadInConfig(); err != nil {
                fmt.Fprintf(os.Stderr, "读取配置文件失败:%v\n", err)
                os.Exit(1)
            }
        }
    
        // 4. 读取配置项
        projectName := viper.GetString("name")
        port := viper.GetInt("port")
        fmt.Printf("ProjectName: %s, Port: %d\n", projectName, port)
    }
    
  • config.yaml

    name: hello
    host: 10.10.0.172
    port: 9090
    
  • 支持环境变量、命令行参数、配置文件。

  • 支持多种配置文件,包括 JSON,YAML,TOML,INI 等。
  • 支持监控配置文件的变化,会自动加载新的配置。
  • 支持从远程加载配置,比如 etcd、zk、consul、redis 等,
    也可以通过 RemoteProvider 接口自定义远程数据源:

    type RemoteProvider interface {
        Set(key string, value []byte) error
        Watch(key string) (chan *RemoteResponse, chan error)
        Get(key string) ([]byte, error)
    }
    
  • 支持默认值。