如何优雅地在Golang中创建配置文件?

8

我是一个Golang的新手。 我想编写一个程序来管理我的Redis实例,以便可以创建一个带有特定配置文件的Redis连接。但我不知道如何优雅地创建Redis实例的配置文件。

我之前发现了"text/template",这个是一个好主意吗?


1
可能是如何在Go中处理配置的重复问题。 - icza
5个回答

8

这取决于您想要支持哪种配置文件格式。

一个能够读取大多数格式(从简单的ini文件到JSON文件)的库是spf13/viper

Viper是Go应用程序的完整配置解决方案。它已经被设计为在应用程序内部处理所有类型的配置。它支持

  • 设置默认值
  • 从yaml、toml和json配置文件中读取
  • 从环境变量中读取
  • 从远程配置系统(Etcd或Consul)中读取
  • 从命令行标志中读取
  • 设置显式值

你的 viper 链接已经失效了,但是那个库看起来非常酷。感谢分享! - Lander
1
@Lander 我修复了链接。 - VonC

4

Redis配置文件采用简单的文本格式。您可以使用fmt包生成配置文件:

fmt.Fprintf(w, "pidfile %s\n", pidFile)
fmt.Fprintf(w, "port %d\n", port)

其中w是用于输出的io.Writer

text/template包也是一个可行的选项。给定模板:

pidfile {{.PidFile}}
port {{.Port}}

您可以使用以下命令来执行它:

t.Execute(w, map[string]interface{}{
   "PidFile": pidFile,
   "Port": port,
})

3
如果您想为开发、测试、暂存和生产制作配置文件,我建议使用Go提供的// +build功能。

设置您的Go程序

按照以下方式在config包中创建4个文件:

src/program/config
               |
               |--config_dev.go
               |--config_test.go
               |--config_staging.go
               |--config_prod.go

在配置文件中

然后在每个文件中,您定义了使用该文件的标记来进行go build(或运行等)过程。

这意味着例如在config_dev.go中:

// +build dev

package config

// Development ready configuration const based on the build tags.
const (
    MYSETTINGS = "dev blablabla"
    ISREADY    = false
)

config_test.go文件中,看起来像这样:
// +build test

package config

// Development ready configuration const based on the build tags.
const (
    MYSETTINGS = "test blablabla"
    ISREADY    = true
)

请注意// +build dev// +build test。这些是您在构建过程中要使用的标签,以告诉您要使用哪个配置文件。

在任何其他Go文件中,您只需调用config.ISREADY,而无需在文件中导入任何除"config"之外的内容。


构建

然后要构建您的应用程序,您只需运行:

go build -tags dev 以使用开发配置进行构建

或者

go build -tags test 以使用测试配置进行构建。


1
由于Redis配置文件的结构非常简单,我建议您查看使用Reader.Comma分隔符设置为空格的编码/ csv包。它可以让您轻松地读取、解析和编写配置。对我来说,“slaveof {{.Host}} {{.Port}}”模板看起来不是很方便。但这肯定是正确的方法。只是个人口味问题。

-1

我建议使用一些配置库。我喜欢 Viper,因为它非常完整。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接