Viper
官方文档
go-viper
是 Go 语言中常用的配置管理库,它可以帮助开发者轻松地处理应用程序中的配置文件、环境变量、命令行参数等。viper
的设计使其能够支持多种配置格式,灵活且易于使用。
主要特性:
- 多种配置格式支持:支持 JSON、TOML、YAML、HCL、TOML、Java properties 等多种格式的配置文件。
- 环境变量支持:可以直接从系统环境变量中读取配置。
- 命令行参数集成:与
flag
包结合,支持从命令行参数获取配置。 - 热重载配置:支持配置文件的动态更新,无需重启应用程序。
- 嵌套配置:支持深度嵌套的配置结构,便于复杂应用的管理。
- 默认值设置:可以为未提供的配置项设置默认值。
- 配置文件的优先级管理:支持多种配置源(文件、环境变量、命令行参数等)并根据优先级读取。
安装
你可以通过 go get
来安装 viper
:
go get github.com/spf13/viper
基本使用
1. 读取配置文件
package main
import (
"fmt"
"github.com/spf13/viper"
)
func main() {
// 设置配置文件名(不需要文件扩展名)
viper.SetConfigName("config")
// 设置配置文件路径
viper.AddConfigPath(".")
// 配置文件格式 (例如: "yaml", "json")
viper.SetConfigType("yaml")
// 读取配置文件
err := viper.ReadInConfig()
if err != nil {
panic(fmt.Errorf("无法读取配置文件: %s \n", err))
}
// 读取配置项
port := viper.GetInt("server.port")
fmt.Printf("Server port: %d\n", port)
}
在上述代码中,我们读取了一个名为 config.yaml
的配置文件,该文件可以包含如下内容:
server:
port: 8080
2. 通过环境变量获取配置
viper
支持从环境变量中获取配置项,通常用于在不同环境(开发、测试、生产)下运行应用时动态加载配置信息。
package main
import (
"fmt"
"github.com/spf13/viper"
)
func main() {
// 绑定环境变量
viper.AutomaticEnv()
// 设置环境变量前缀
viper.SetEnvPrefix("app")
// 读取环境变量
port := viper.GetInt("PORT")
fmt.Printf("Server port from env: %d\n", port)
}
在终端中设置环境变量并运行:
export APP_PORT=9090
go run main.go
输出将会是:
Server port from env: 9090
3. 设置默认值
如果配置项不存在,可以通过 viper
设置默认值。
package main
import (
"fmt"
"github.com/spf13/viper"
)
func main() {
// 设置默认值
viper.SetDefault("server.port", 3000)
// 读取配置项
port := viper.GetInt("server.port")
fmt.Printf("Default Server port: %d\n", port)
}
4. 热加载配置文件
viper
支持热加载配置文件,适用于需要动态更新配置的场景。例如,在开发服务器中更新配置时无需重启。
package main
import (
"fmt"
"github.com/spf13/viper"
"time"
)
func main() {
viper.SetConfigFile("config.yaml")
viper.WatchConfig()
viper.OnConfigChange(func(e fsnotify.Event) {
fmt.Println("Config file changed:", e.Name)
})
err := viper.ReadInConfig()
if err != nil {
panic(fmt.Errorf("Fatal error config file: %w \n", err))
}
for {
fmt.Println("Server port:", viper.GetInt("server.port"))
time.Sleep(time.Second * 5)
}
}
总结
viper
提供了一个强大且灵活的配置管理方案,支持多种配置源和动态配置更新,是 Go 项目中常用的库之一。在实际项目中,可以将其与 cobra
等命令行工具结合使用,来实现更复杂的配置管理和应用控制。