golang持久化保存flags到ini配置文件的插件库ingo的使用
golang持久化保存flags到ini配置文件的插件库ingo的使用
ingo是一个简单的Go库,可以帮助你将flags持久化保存到ini风格的配置文件中。
特性和限制
- 需要Go 1.5或更高版本
- 如果配置文件不存在,会自动创建
- 选项值优先级(从高到低): 0. 命令行给出的flags 0. 从配置文件中读取的flags 0. 初始化flags时给出的默认值
- 如果配置文件中没有设置,则将默认值写入配置文件
- 配置文件中的每个flag都会在前面添加flag用法作为注释
- 指向同一个变量的简写flags不会被写入配置文件以减少噪音
- 只有当配置文件会发生变化时才会重写
- 不再使用的旧flags不会被删除
- 当发现旧flags时,会向stderr打印警告
- flags不能包含字符
:
和=
,也不能以#
开头 - 不支持sections、namespaces或默认FlagSet之外的其他FlagSet
安装
go get -u github.com/schachmat/ingo
使用示例
只需像往常一样设置带有默认值的flags。不需要调用flag.Parse()
,而是调用ingo.Parse(APPLICATION_NAME)
并检查是否返回错误。
package main
import (
"flag"
"fmt"
"log"
"github.com/schachmat/ingo"
)
func main() {
num := flag.Int("num", 3, "`NUMBER` of times to\n \tdo a barrel roll")
location := flag.String("location", "space", "`WHERE` to do the barrel roll")
flag.StringVar(location, "l", "space", "`WHERE` to do the barrel roll (shorthand)")
if err := ingo.Parse("keep_rollin"); err != nil {
log.Fatal(err)
}
fmt.Println(*num, *location)
}
(一个换行符、四个空格、一个制表符)分隔符将确保多行用法字符串在配置文件和-h
帮助消息中正确布局。代码将创建以下配置文件.keep_rollinrc
(如果在环境变量KEEP_ROLLINRC
中指定,则可以是其他位置):
# WHERE to do the barrel roll
location=space
# NUMBER of times to
# do a barrel roll
num=3
如果将num更改为5,它将在所有未来运行中保持持久化:
# WHERE to do the barrel roll
location=space
# NUMBER of times to
# do a barrel roll
num=5
如果向程序中添加新flag style
,它将在第一次运行时使用flag的默认值添加到配置文件中:
# WHERE to do the barrel roll
location=space
# NUMBER of times to
# do a barrel roll
num=5
# HOW to do the barrel roll
style=epic
如果从程序中删除两个location flags,配置条目将被重写为:
# NUMBER of times to
# do a barrel roll
num=5
# HOW to do the barrel roll
style=epic
# The following options are probably deprecated and not used currently!
location=space
当发现此类旧flags时,运行ingo.Parse
时会向stderr打印如下警告:
!!!!!!!!!!
! WARNING: keep_rollin was probably updated,
! Check and update .keep_rollinrc as necessary
! and remove the last "deprecated" paragraph to disable this message!
!!!!!!!!!!
所有配置文件都会有如下标题解释语法:
# keep_rollin configuration
#
# This config has https://github.com/schachmat/ingo syntax.
# Empty lines or lines starting with # will be ignored.
# All other lines must look like "KEY=VALUE" (without the quotes).
# The VALUE must not be enclosed in quotes as well!
许可证 - ISC
Copyright © 2016-2017, teichm@in.tum.de
Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED “AS IS” AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
更多关于golang持久化保存flags到ini配置文件的插件库ingo的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang持久化保存flags到ini配置文件的插件库ingo的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用ingo库持久化保存flags到INI配置文件
ingo是一个简单易用的Go库,用于将命令行flags持久化保存到INI格式的配置文件中。下面我将详细介绍如何使用ingo库。
安装
首先安装ingo库:
go get github.com/schachmat/ingo
基本用法
1. 定义flags并绑定到配置文件
package main
import (
"flag"
"fmt"
"log"
"github.com/schachmat/ingo"
)
var (
name = flag.String("name", "Guest", "Your name")
age = flag.Int("age", 30, "Your age")
verbose = flag.Bool("verbose", false, "Verbose output")
)
func main() {
// 注册flags到ingo
if err := ingo.Register("app.ini"); err != nil {
log.Fatal(err)
}
// 解析flags
flag.Parse()
// 打印结果
fmt.Printf("Hello %s, age %d (verbose: %v)\n", *name, *age, *verbose)
}
2. 运行程序
第一次运行程序时,会创建配置文件:
$ go run main.go -name John -age 25 -verbose
Hello John, age 25 (verbose: true)
这会在当前目录下创建app.ini
文件,内容如下:
[Flags]
age = 25
name = John
verbose = true
下次运行程序时,如果不带参数,会自动从配置文件加载:
$ go run main.go
Hello John, age 25 (verbose: true)
高级用法
1. 自定义配置节
默认情况下,flags保存在[Flags]
节中,你可以自定义节名:
ingo.RegisterWithSection("myapp.ini", "MySettings")
2. 忽略某些flags
如果你不想某些flags被持久化:
ingo.RegisterWithOptions("app.ini", ingo.Options{
IgnoreFlags: []string{"verbose"},
})
3. 强制重新解析flags
如果你想忽略配置文件,强制使用命令行参数:
$ go run main.go -name Bob -age 40 -verbose=false
完整示例
package main
import (
"flag"
"fmt"
"log"
"github.com/schachmat/ingo"
)
var (
host = flag.String("host", "localhost", "Server host")
port = flag.Int("port", 8080, "Server port")
debug = flag.Bool("debug", false, "Debug mode")
username = flag.String("username", "admin", "Login username")
)
func main() {
// 注册flags,忽略debug flag
if err := ingo.RegisterWithOptions("config.ini", ingo.Options{
Section: "ServerConfig",
IgnoreFlags: []string{"debug"},
}); err != nil {
log.Fatal(err)
}
flag.Parse()
fmt.Printf("Server configuration:\n")
fmt.Printf(" Host: %s\n", *host)
fmt.Printf(" Port: %d\n", *port)
fmt.Printf(" Debug: %v\n", *debug)
fmt.Printf(" Username: %s\n", *username)
}
注意事项
- ingo会在
Parse()
之前自动调用flag.Parse()
,所以不需要手动调用 - 配置文件中的值会覆盖默认值,但命令行参数会覆盖配置文件中的值
- 对于布尔类型的flag,配置文件中的值可以是
true
/false
、1
/0
、on
/off
等 - 如果配置文件不存在,会自动创建
ingo是一个轻量级的解决方案,适合简单的配置持久化需求。对于更复杂的配置管理,可以考虑使用viper等更强大的配置库。