如何优雅地在 Golang 中制作配置文件?
How to make config file in Golang elegantly?
我是 Golang 的新手。
我想编写一个程序来管理我的 Redis 实例,以便我可以使用特定的配置文件创建 Redis 连接。但是我不知道如何优雅地为Redis实例创建配置文件。
我之前找到了“text/template”,这是个好主意吗?
这取决于您希望这些配置支持的文件格式。
一个能够读取大部分格式(从简单的 ini 文件到 JSON 文件)的库是 spf13/viper:
Viper is a complete configuration solution for go applications. It has been designed to work within an application to handle all types of configuration. It supports
- setting defaults
- reading from yaml, toml and json config files
- reading from environment variables
- reading from remote config systems (Etcd or Consul)
- reading from command line flags
- setting explicit values
由于 redis 配置文件的结构非常简单,我建议您查看 encoding/csv 包,其中 Reader.Comma 分隔符设置为空白 space。它允许您轻松读取、解析和写入配置。在我看来 "slaveof {{.Host}} {{.Port}}" 因为模板看起来不是很方便。但它肯定是正确的方法。只是品味问题。
Redis configuration files 有一个简单的文本格式。您可以使用 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,
})
我建议使用一些配置库。我喜欢 Viper 因为完整性。
如果你想为开发、测试、暂存和生产制作配置文件,我建议使用 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
使用 测试配置 构建。
我是 Golang 的新手。 我想编写一个程序来管理我的 Redis 实例,以便我可以使用特定的配置文件创建 Redis 连接。但是我不知道如何优雅地为Redis实例创建配置文件。
我之前找到了“text/template”,这是个好主意吗?
这取决于您希望这些配置支持的文件格式。
一个能够读取大部分格式(从简单的 ini 文件到 JSON 文件)的库是 spf13/viper:
Viper is a complete configuration solution for go applications. It has been designed to work within an application to handle all types of configuration. It supports
- setting defaults
- reading from yaml, toml and json config files
- reading from environment variables
- reading from remote config systems (Etcd or Consul)
- reading from command line flags
- setting explicit values
由于 redis 配置文件的结构非常简单,我建议您查看 encoding/csv 包,其中 Reader.Comma 分隔符设置为空白 space。它允许您轻松读取、解析和写入配置。在我看来 "slaveof {{.Host}} {{.Port}}" 因为模板看起来不是很方便。但它肯定是正确的方法。只是品味问题。
Redis configuration files 有一个简单的文本格式。您可以使用 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,
})
我建议使用一些配置库。我喜欢 Viper 因为完整性。
如果你想为开发、测试、暂存和生产制作配置文件,我建议使用 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
使用 测试配置 构建。