props 解析各种 ini / yaml 等
最后更新于:2022-04-02 02:39:39
[TOC]
> [github](https://github.com/tietang/props)
## 概述
### 支持的配置源:
* properties格式文件
* ini格式文件
* yaml格式文件
* [Apollo](https://github.com/ctripcorp/apollo)k/v,k/props,k/ini,k/yaml
* [Nacos](http://nacos.io/)k/props\[properties\],k/yaml,k/ini,k/ini\_props
* zookeeper k/v
* zookeeper k/props\[properties\],k/yaml,k/ini,k/ini\_props
* consul k/v
* consul k/props\[properties\],k/yaml,k/ini,k/ini\_props
* etcd API V2 k/v
* etcd API V2 k/props
* etcd API V3 k/v
* etcd API V3 k/props
### key/value支持的数据类型:
* key只支持string
* value 5种数据类型的支持:
* string
* int
* float64
* bool
* time.Duration:
* 比如 "300ms", "-1.5h" or "2h45m".
* 合法的时间单位: "ns", "us" (or "µs"), "ms", "s", "m", "h".
### 其他特性
* Unmarshal支持
* 上下文变量eval支持,`${}`形式
* 支持多配置源组合
* 默认添加了系统环境变量,优先级最低
## 安装
`go get -u github.com/tietang/props`
## 格式
### properties
`[key][=|:][value]`
例子:
config.properties
```
server.port=8080
//or
server.port: 8080
```
#### kvs.ReadPropertyFile 从文件读取
```
p, e := kvs.ReadPropertyFile("config.properties")
p.Get("server.port") //8080
p.Get("prefix.key1")
p.GetDefault("prefix.key1", "default value")
p.GetBool("prefix.key2")
p.GetBoolDefault("prefix.key2", false)
p.GetInt("prefix.key3")
p.GetIntDefault("prefix.key3", 1)
p.GetFloat64("prefix.key4")
p.GetFloat64Default("prefix.key4", 1.2)
```
#### kvs.NewProperties() 通过 io.reader
```
p := kvs.NewProperties()
p.Load(strings.NewReader("server.port=8080\nserver.ip=127.0.0.1"))
p.Get("server.ip") //127.0.0.1
```
#### kvs.NewPropertiesConfigSource()
```
var cs kvs.ConfigSource
cs = kvs.NewPropertiesConfigSource("conf/config.properties")
cs.Get("server.port") //8080
var cs kvs.ConfigSource
cs = kvs.NewPropertiesConfigSourceByFile("conf", "conf/config.properties")
cs.Get("server.port") //8080
//向 map 中获取参数
var cs kvs.ConfigSource
m := make(map[string]string)
m["server.port"] = "8080"
cs = kvs.NewPropertiesConfigSourceByMap("conf", m)
cs.Get("server.port") //8080
```
### ini格式文件
格式:
```
[section]
[key1][=|:][value1]
[key1][=|:][value1]
```
```
file := "conf/config.ini"
p := ini.NewIniFileConfigSource(file)
p = ini.NewIniFileConfigSourceByFile("name", file)
s, _ := p.Get("server.port")
```
### 上下文变量表达式(或者占位符)的支持
支持在props上下文中替换占位符:${}
```
p := kvs.NewEmptyMapConfigSource("map2")
p.Set("orign.key1", "v1")
p.Set("orign.key2", "v2")
p.Set("orign.key3", "2")
p.Set("ph.key1", "${orign.key1}")
p.Set("ph.key2", "${orign.key1}:${orign.key2}")
p.Set("ph.key3", "${orign.key3}")
conf := kvs.NewDefaultCompositeConfigSource(p)
phv1, err := conf.GetInt("ph.key1")//v1
phv2, err := conf.Get("ph.key2")//v1:v1
phv3, err := conf.GetInt("ph.key3")//2
```
### 多种配置源组合使用
优先级以追加相反的顺序,最后添加优先级最高。
```
conf := kvs.NewEmptyCompositeConfigSource()
kv1 := []string{"go.app.key1", "value1", "value1-2"}
kv2 := []string{"go.app.key2", "value2", "value2-2"}
p1 := kvs.NewEmptyMapConfigSource("map1")
p1.Set(kv1[0], kv1[1]) // go.app.key1=value1
p1.Set(kv2[0], kv2[1]) // go.app.key1=value2
p2 := kvs.NewEmptyMapConfigSource("map2")
p2.Set(kv1[0], kv1[2]) // go.app.key2=value1-2
p2.Set(kv2[0], kv2[2]) // go.app.key2=value2-2
conf.Add(p1)
conf.Add(p2)
conf.Get(kv1[0]) //value1-2
conf.Get(kv2[0]) //value2-2
```
';